--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / frontend / components / messages / ConversationViewer.vue
Displaying Raw • Download
meshchatx/src/frontend/components/messages/ConversationViewer.vue 2e242899ddc2a00ca3e08e6de5dc7bfa8162b087 (2e242899) Text, 190.27 KB
Tb4b4b4<Tff7b72templateTb4b4b4>
T8b949e<!-- peer selected -->
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3selectedPeerTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"flex flex-col h-full bg-white dark:bg-zinc-950 overflow-hidden transition-all relative"
Tb4b4b4>
T8b949e<!-- banished overlay -->
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3GlobalStateTb4b4b4.Te6edf3configTb4b4b4.Te6edf3banished_effect_enabled Tff7b72&& Te6edf3isSelectedPeerBlockedTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"banished-overlay"
Tb4b4b4:Te6edf3styleTff7b72=Ta5d6ff"Tb4b4b4{ Te6edf3backgroundTff7b72: Te6edf3GlobalStateTb4b4b4.Te6edf3configTb4b4b4.Te6edf3banished_color Tff7b72+ Ta5d6ff'33' Tb4b4b4}Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72span
Te6edf3classTff7b72=Ta5d6ff"banished-text !opacity-100 !text-white !shadow-lg !bg-red-600 !px-4 !py-2 !rounded-xl !border-2 !tracking-widest"
Tb4b4b4:Te6edf3styleTff7b72=Ta5d6ff"Tb4b4b4{
Ta5d6ff'background-color'Tff7b72: Te6edf3GlobalStateTb4b4b4.Te6edf3configTb4b4b4.Te6edf3banished_colorTb4b4b4,
Ta5d6ff'border-color'Tff7b72: Te6edf3GlobalStateTb4b4b4.Te6edf3configTb4b4b4.Te6edf3banished_colorTb4b4b4,
Tb4b4b4}Ta5d6ff"
Tb4b4b4>Tff7b72{{ Te6edf3GlobalStateTb4b4b4.Te6edf3configTb4b4b4.Te6edf3banished_text Tff7b72}}Tb4b4b4<Tb4b4b4/Tff7b72span
Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- header -->
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"relative z-20 flex items-center px-4 py-3 border-b border-gray-200/60 dark:border-zinc-800/60 bg-white/80 dark:bg-zinc-900/50 backdrop-blur-sm"
Tb4b4b4>
T8b949e<!-- peer icon -->
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex-shrink-0 mr-3"Tb4b4b4>
Tb4b4b4<Tff7b72LxmfUserIcon
Tb4b4b4:Te6edf3custom-imageTff7b72=Ta5d6ff"Te6edf3selectedPeerTb4b4b4.Te6edf3contact_imageTa5d6ff"
Tb4b4b4:Te6edf3icon-nameTff7b72=Ta5d6ff"Te6edf3selectedPeerTb4b4b4.Te6edf3lxmf_user_icon Tff7b72? Te6edf3selectedPeerTb4b4b4.Te6edf3lxmf_user_iconTb4b4b4.Te6edf3icon_name Tff7b72: Ta5d6ff''Ta5d6ff"
Tb4b4b4:Te6edf3icon-foreground-colourTff7b72=Ta5d6ff"
Te6edf3selectedPeerTb4b4b4.Te6edf3lxmf_user_icon Tff7b72? Te6edf3selectedPeerTb4b4b4.Te6edf3lxmf_user_iconTb4b4b4.Te6edf3foreground_colour Tff7b72: Ta5d6ff''
Ta5d6ff"
Tb4b4b4:Te6edf3icon-background-colourTff7b72=Ta5d6ff"
Te6edf3selectedPeerTb4b4b4.Te6edf3lxmf_user_icon Tff7b72? Te6edf3selectedPeerTb4b4b4.Te6edf3lxmf_user_iconTb4b4b4.Te6edf3background_colour Tff7b72: Ta5d6ff''
Ta5d6ff"
Te6edf3icon-classTff7b72=Ta5d6ff"shrink-0"
Tb4b4b4:Te6edf3icon-styleTff7b72=Ta5d6ff"Te6edf3messageIconStyleTa5d6ff"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- peer info -->
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"min-w-0 flex-1"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex items-center cursor-pointer min-w-0 group" Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3updateCustomDisplayNameTa5d6ff"Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3selectedPeerTb4b4b4.Te6edf3custom_display_name Tff7b72!= Tff7b72nullTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"mr-1.5 text-gray-500 dark:text-zinc-400 group-hover:text-gray-700 dark:group-hover:text-zinc-200 transition-colors"
Tb4b4b4:Te6edf3titleTff7b72=Ta5d6ff"Te6edf3$tTb4b4b4(Ta5d6ff'messages.custom_display_name'Tb4b4b4)Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"tag-outline" Te6edf3classTff7b72=Ta5d6ff"size-4" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"font-semibold text-gray-900 dark:text-zinc-100 truncate max-w-[120px] sm:max-w-sm text-base"
Tb4b4b4:Te6edf3titleTff7b72=Ta5d6ff"Te6edf3selectedPeerTb4b4b4.Te6edf3custom_display_name Tff7b72?? Te6edf3selectedPeerTb4b4b4.Te6edf3display_nameTa5d6ff"
Tb4b4b4>
Tff7b72{{ Te6edf3selectedPeerTb4b4b4.Te6edf3custom_display_name Tff7b72?? Te6edf3selectedPeerTb4b4b4.Te6edf3display_name Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-xs text-gray-500 dark:text-zinc-400 mt-0.5 flex items-center gap-2 min-w-0"Tb4b4b4>
T8b949e<!-- destination hash -->
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"cursor-pointer hover:text-blue-500 transition-colors truncate max-w-[120px] sm:max-w-none shrink-0"
Tb4b4b4:Te6edf3titleTff7b72=Ta5d6ff"Te6edf3selectedPeerTb4b4b4.Te6edf3destination_hashTa5d6ff"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3copyHashTb4b4b4(Te6edf3selectedPeerTb4b4b4.Te6edf3destination_hashTb4b4b4)Ta5d6ff"
Tb4b4b4>
Tff7b72{{ Te6edf3formatDestinationHashTb4b4b4(Te6edf3selectedPeerTb4b4b4.Te6edf3destination_hashTb4b4b4) Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"
Te6edf3selectedPeerPath Tff7b72||
Te6edf3selectedPeerSignalMetricsTff7b72?Tb4b4b4.Te6edf3snr Tff7b72!= Tff7b72null Tff7b72||
Te6edf3selectedPeerLxmfStampInfoTff7b72?Tb4b4b4.Te6edf3stamp_cost
Ta5d6ff"
Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2 min-w-0"
Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-gray-300 dark:text-zinc-700 shrink-0"Tb4b4b4>•Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2 truncate"Tb4b4b4>
T8b949e<!-- hops away -->
Tb4b4b4<Tff7b72span
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3selectedPeerPathTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"flex items-center cursor-pointer hover:text-gray-700 dark:hover:text-zinc-200 shrink-0"
Te6edf3titleTff7b72=Ta5d6ff"Path information"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3onDestinationPathClickTb4b4b4(Te6edf3selectedPeerPathTb4b4b4)Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3selectedPeerPathTb4b4b4.Te6edf3hops Tff7b72=== T79c0ff0 Tff7b72|| Te6edf3selectedPeerPathTb4b4b4.Te6edf3hops Tff7b72=== T79c0ff1Ta5d6ff"Tb4b4b4>Tff7b72{{
Te6edf3$tTb4b4b4(Ta5d6ff"messages.direct"Tb4b4b4)
Tff7b72}}Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3v-elseTb4b4b4>Tff7b72{{ Te6edf3$tTb4b4b4(Ta5d6ff"messages.hops_away"Tb4b4b4, Tb4b4b4{ Te6edf3countTff7b72: Te6edf3selectedPeerPathTb4b4b4.Te6edf3hops Tb4b4b4}Tb4b4b4) Tff7b72}}Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
T8b949e<!-- snr -->
Tb4b4b4<Tff7b72span
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3selectedPeerSignalMetricsTff7b72?Tb4b4b4.Te6edf3snr Tff7b72!= Tff7b72nullTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2 shrink-0"
Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-gray-300 dark:text-zinc-700 opacity-50"Tb4b4b4>•Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tff7b72span
Te6edf3classTff7b72=Ta5d6ff"cursor-pointer hover:text-gray-700 dark:hover:text-zinc-200"
Te6edf3titleTff7b72=Ta5d6ff"Signal quality"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3onSignalMetricsClickTb4b4b4(Te6edf3selectedPeerSignalMetricsTb4b4b4)Ta5d6ff"
Tb4b4b4>Tff7b72{{ Te6edf3$tTb4b4b4(Ta5d6ff"messages.snr"Tb4b4b4, Tb4b4b4{ Te6edf3snrTff7b72: Te6edf3selectedPeerSignalMetricsTb4b4b4.Te6edf3snr Tb4b4b4}Tb4b4b4) Tff7b72}}Tb4b4b4<Tb4b4b4/Tff7b72span
Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
T8b949e<!-- stamp cost -->
Tb4b4b4<Tff7b72span Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3selectedPeerLxmfStampInfoTff7b72?Tb4b4b4.Te6edf3stamp_costTa5d6ff" Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2 shrink-0"Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-gray-300 dark:text-zinc-700 opacity-50"Tb4b4b4>•Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tff7b72span
Te6edf3classTff7b72=Ta5d6ff"cursor-pointer hover:text-gray-700 dark:hover:text-zinc-200"
Te6edf3titleTff7b72=Ta5d6ff"LXMF stamp requirement"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3onStampInfoClickTb4b4b4(Te6edf3selectedPeerLxmfStampInfoTb4b4b4)Ta5d6ff"
Tb4b4b4>Tff7b72{{
Te6edf3$tTb4b4b4(Ta5d6ff"messages.stamp_cost"Tb4b4b4, Tb4b4b4{ Te6edf3costTff7b72: Te6edf3selectedPeerLxmfStampInfoTb4b4b4.Te6edf3stamp_cost Tb4b4b4}Tb4b4b4)
Tff7b72}}Tb4b4b4<Tb4b4b4/Tff7b72span
Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- dropdown menu -->
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"ml-auto flex items-center gap-1.5"Tb4b4b4>
T8b949e<!-- retry all failed messages -->
Tb4b4b4<Tff7b72IconButton
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3hasFailedOrCancelledMessagesTa5d6ff"
Te6edf3titleTff7b72=Ta5d6ff"Retry all failed/cancelled messages"
Te6edf3classTff7b72=Ta5d6ff"text-red-500 hover:bg-red-50 dark:hover:bg-red-900/20"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3retryAllFailedOrCancelledMessagesTa5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"refresh" Te6edf3classTff7b72=Ta5d6ff"size-7" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72IconButtonTb4b4b4>
T8b949e<!-- telemetry history button -->
Tb4b4b4<Tff7b72IconButton Te6edf3titleTff7b72=Ta5d6ff"View Telemetry History" Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3isTelemetryHistoryModalOpen Tff7b72= Tff7b72trueTa5d6ff"Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"satellite-variant" Te6edf3classTff7b72=Ta5d6ff"size-7" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72IconButtonTb4b4b4>
T8b949e<!-- call button -->
Tb4b4b4<Tff7b72IconButton Te6edf3titleTff7b72=Ta5d6ff"Start a Call" Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3onStartCallTa5d6ff"Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"phone" Te6edf3classTff7b72=Ta5d6ff"size-7" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72IconButtonTb4b4b4>
T8b949e<!-- share contact button -->
Tb4b4b4<Tff7b72IconButton Te6edf3titleTff7b72=Ta5d6ff"Share Contact" Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3openShareContactModalTa5d6ff"Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"notebook-outline" Te6edf3classTff7b72=Ta5d6ff"size-7" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72IconButtonTb4b4b4>
Tb4b4b4<Tff7b72ConversationDropDownMenu
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3selectedPeerTa5d6ff"
Tb4b4b4:Te6edf3peerTff7b72=Ta5d6ff"Te6edf3selectedPeerTa5d6ff"
Tb4b4b4@Te6edf3conversation-deletedTff7b72=Ta5d6ff"Te6edf3onConversationDeletedTa5d6ff"
Tb4b4b4@Te6edf3set-custom-display-nameTff7b72=Ta5d6ff"Te6edf3updateCustomDisplayNameTa5d6ff"
Tb4b4b4@Te6edf3popoutTff7b72=Ta5d6ff"Te6edf3openConversationPopoutTa5d6ff"
Tb4b4b4/Tb4b4b4>
T8b949e<!-- close button -->
Tb4b4b4<Tff7b72IconButton Te6edf3titleTff7b72=Ta5d6ff"Close" Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3closeTa5d6ff"Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"close" Te6edf3classTff7b72=Ta5d6ff"size-7" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72IconButtonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- Telemetry History Modal -->
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3isTelemetryHistoryModalOpenTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"fixed inset-0 z-[100] flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm"
Tb4b4b4@Te6edf3clickTb4b4b4.Te6edf3selfTff7b72=Ta5d6ff"Te6edf3isTelemetryHistoryModalOpen Tff7b72= Tff7b72falseTa5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"w-full max-w-lg bg-white dark:bg-zinc-900 rounded-2xl shadow-2xl overflow-hidden flex flex-col max-h-[80vh]"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"px-6 py-4 border-b border-gray-100 dark:border-zinc-800 flex items-center justify-between"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2"Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"satellite-variant" Te6edf3classTff7b72=Ta5d6ff"size-6 text-blue-500" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72h3 Te6edf3classTff7b72=Ta5d6ff"text-lg font-bold text-gray-900 dark:text-white"Tb4b4b4>Telemetry HistoryTb4b4b4<Tb4b4b4/Tff7b72h3Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"text-gray-400 hover:text-gray-500 dark:hover:text-zinc-300 transition-colors"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3isTelemetryHistoryModalOpen Tff7b72= Tff7b72falseTa5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"close" Te6edf3classTff7b72=Ta5d6ff"size-6" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex-1 overflow-y-auto p-4 space-y-3"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3selectedPeerTelemetryItemsTb4b4b4.Te6edf3length Tff7b72=== T79c0ff0Ta5d6ff" Te6edf3classTff7b72=Ta5d6ff"text-center py-8 text-gray-400"Tb4b4b4>
No telemetry history found for this peer.
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3v-forTff7b72=Ta5d6ff"Te6edf3item Tff7b72in Te6edf3selectedPeerTelemetryItemsTa5d6ff"
Tb4b4b4:Te6edf3keyTff7b72=Ta5d6ff"Te6edf3itemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hashTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"p-3 rounded-xl border border-gray-100 dark:border-zinc-800 bg-gray-50/50 dark:bg-zinc-900/30"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex justify-between items-start mb-2"Tb4b4b4>
Tb4b4b4<Tff7b72span
Te6edf3classTff7b72=Ta5d6ff"text-[10px] font-bold uppercase tracking-wider px-2 py-0.5 rounded bg-gray-200 dark:bg-zinc-800 text-gray-600 dark:text-zinc-400"
Tb4b4b4>
Tff7b72{{ Te6edf3itemTb4b4b4.Te6edf3is_outbound Tff7b72? Ta5d6ff"Sent" Tff7b72: Ta5d6ff"Received" Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-[10px] text-gray-400"Tb4b4b4>Tff7b72{{
Te6edf3formatTimeAgoTb4b4b4(Te6edf3itemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3created_atTb4b4b4)
Tff7b72}}Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- location -->
Tb4b4b4<Tff7b72div Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3itemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTff7b72?Tb4b4b4.Te6edf3telemetryTff7b72?Tb4b4b4.Te6edf3locationTa5d6ff" Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2 mb-2"Tb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2 text-xs font-mono text-blue-600 dark:text-blue-400 hover:underline"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3viewLocationOnMapTb4b4b4(Te6edf3itemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3telemetryTb4b4b4.Te6edf3locationTb4b4b4)Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"map-marker" Te6edf3classTff7b72=Ta5d6ff"size-4" Tb4b4b4/Tb4b4b4>
Tff7b72{{ Te6edf3itemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3telemetryTb4b4b4.Te6edf3locationTb4b4b4.Te6edf3latitudeTb4b4b4.Te6edf3toFixedTb4b4b4(T79c0ff6Tb4b4b4) Tff7b72}},
Tff7b72{{ Te6edf3itemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3telemetryTb4b4b4.Te6edf3locationTb4b4b4.Te6edf3longitudeTb4b4b4.Te6edf3toFixedTb4b4b4(T79c0ff6Tb4b4b4) Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- sensors -->
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3itemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTff7b72?Tb4b4b4.Te6edf3telemetryTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"flex flex-wrap gap-3 text-[10px] text-gray-500"
Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3itemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3telemetryTb4b4b4.Te6edf3batteryTa5d6ff" Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-1"Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"battery" Te6edf3classTff7b72=Ta5d6ff"size-3" Tb4b4b4/Tb4b4b4>
Battery: Tff7b72{{ Te6edf3itemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3telemetryTb4b4b4.Te6edf3batteryTb4b4b4.Te6edf3charge_percent Tff7b72}}%
Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tff7b72span
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3itemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3telemetryTb4b4b4.Te6edf3physical_linkTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-1"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"antenna" Te6edf3classTff7b72=Ta5d6ff"size-3" Tb4b4b4/Tb4b4b4>
SNR: Tff7b72{{ Te6edf3itemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3telemetryTb4b4b4.Te6edf3physical_linkTb4b4b4.Te6edf3snr Tff7b72}}dB
Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- commands -->
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3itemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTff7b72?Tb4b4b4.Te6edf3commandsTff7b72?Tb4b4b4.Te6edf3someTb4b4b4(Tb4b4b4(Te6edf3cTb4b4b4) Tb4b4b4=> Te6edf3cTb4b4b4[Ta5d6ff'0x01'Tb4b4b4]Tb4b4b4)Ta5d6ff"
Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2 text-[10px] text-emerald-600 dark:text-emerald-400 mt-1"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"crosshairs-question" Te6edf3classTff7b72=Ta5d6ff"size-3" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72spanTb4b4b4>Location RequestTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"px-6 py-4 border-t border-gray-100 dark:border-zinc-800 bg-gray-50/30 dark:bg-zinc-900/20 flex flex-col gap-4"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3telemetryBatteryHistoryTb4b4b4.Te6edf3length Tff7b72> T79c0ff1Ta5d6ff" Te6edf3classTff7b72=Ta5d6ff"space-y-2"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex items-center justify-between"Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-[10px] font-bold text-gray-400 uppercase tracking-widest"
Tb4b4b4>Battery Level (%)Tb4b4b4<Tb4b4b4/Tff7b72span
Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-[10px] text-gray-500"
Tb4b4b4>Tff7b72{{ Te6edf3telemetryBatteryHistoryTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4.Te6edf3y Tff7b72}}% →
Tff7b72{{ Te6edf3telemetryBatteryHistoryTb4b4b4[Te6edf3telemetryBatteryHistoryTb4b4b4.Te6edf3length Tff7b72- T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3y Tff7b72}}%Tb4b4b4<Tb4b4b4/Tff7b72span
Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72svg Te6edf3classTff7b72=Ta5d6ff"w-full h-12 overflow-visible" Te6edf3viewBoxTff7b72=Ta5d6ff"0 0 100 100" Te6edf3preserveAspectRatioTff7b72=Ta5d6ff"none"Tb4b4b4>
Tb4b4b4<Tff7b72path
Tb4b4b4:Te6edf3dTff7b72=Ta5d6ff"Te6edf3batterySparklinePathTa5d6ff"
Te6edf3fillTff7b72=Ta5d6ff"none"
Te6edf3strokeTff7b72=Ta5d6ff"#3b82f6"
Te6edf3stroke-widthTff7b72=Ta5d6ff"2"
Te6edf3stroke-linecapTff7b72=Ta5d6ff"round"
Te6edf3stroke-linejoinTff7b72=Ta5d6ff"round"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72circle
Tb4b4b4:Te6edf3cxTff7b72=Ta5d6ff"T79c0ff100Ta5d6ff"
Tb4b4b4:Te6edf3cyTff7b72=Ta5d6ff"T79c0ff100 Tff7b72- Te6edf3telemetryBatteryHistoryTb4b4b4[Te6edf3telemetryBatteryHistoryTb4b4b4.Te6edf3length Tff7b72- T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3yTa5d6ff"
Te6edf3rTff7b72=Ta5d6ff"3"
Te6edf3fillTff7b72=Ta5d6ff"#3b82f6"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72svgTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex justify-between items-center w-full"Tb4b4b4>
Tb4b4b4<Tff7b72label Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2 cursor-pointer group"Tb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3showTelemetryInChatTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"checkbox"
Te6edf3classTff7b72=Ta5d6ff"rounded border-gray-300 text-blue-600 focus:ring-blue-500"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72span
Te6edf3classTff7b72=Ta5d6ff"text-xs font-medium text-gray-600 dark:text-zinc-400 group-hover:text-gray-900 dark:group-hover:text-zinc-200"
Tb4b4b4>Show telemetry in main chatTb4b4b4<Tb4b4b4/Tff7b72span
Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72labelTb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"px-4 py-2 bg-blue-600 text-white text-xs font-bold rounded-lg hover:bg-blue-700 transition-colors shadow-sm"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3isTelemetryHistoryModalOpen Tff7b72= Tff7b72falseTa5d6ff"
Tb4b4b4>
Done
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- Share Contact Modal -->
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3isShareContactModalOpenTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"fixed inset-0 z-[100] flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm"
Tb4b4b4@Te6edf3clickTb4b4b4.Te6edf3selfTff7b72=Ta5d6ff"Te6edf3isShareContactModalOpen Tff7b72= Tff7b72falseTa5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"w-full max-w-md bg-white dark:bg-zinc-900 rounded-2xl shadow-2xl overflow-hidden"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"px-6 py-4 border-b border-gray-100 dark:border-zinc-800 flex items-center justify-between"Tb4b4b4>
Tb4b4b4<Tff7b72h3 Te6edf3classTff7b72=Ta5d6ff"text-lg font-bold text-gray-900 dark:text-white"Tb4b4b4>Share ContactTb4b4b4<Tb4b4b4/Tff7b72h3Tb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"text-gray-400 hover:text-gray-500 dark:hover:text-zinc-300 transition-colors"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3isShareContactModalOpen Tff7b72= Tff7b72falseTa5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"close" Te6edf3classTff7b72=Ta5d6ff"size-6" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"p-6"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"mb-4"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"relative"Tb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3contactsSearchTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"text"
Te6edf3placeholderTff7b72=Ta5d6ff"Search contacts..."
Te6edf3classTff7b72=Ta5d6ff"block w-full rounded-lg border-0 py-2 pl-10 text-gray-900 dark:text-white shadow-sm ring-1 ring-inset ring-gray-300 dark:ring-zinc-800 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-blue-600 sm:text-sm dark:bg-zinc-900"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3"Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"magnify" Te6edf3classTff7b72=Ta5d6ff"size-5 text-gray-400" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"max-h-64 overflow-y-auto space-y-2"Tb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3v-forTff7b72=Ta5d6ff"Te6edf3contact Tff7b72in Te6edf3filteredContactsTa5d6ff"
Tb4b4b4:Te6edf3keyTff7b72=Ta5d6ff"Te6edf3contactTb4b4b4.Te6edf3idTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"w-full flex items-center gap-3 p-3 rounded-xl hover:bg-gray-50 dark:hover:bg-zinc-800 transition-colors text-left"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3shareContactTb4b4b4(Te6edf3contactTb4b4b4)Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"size-10 rounded-full bg-blue-50 dark:bg-blue-900/20 text-blue-500 flex items-center justify-center shrink-0"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"account" Te6edf3classTff7b72=Ta5d6ff"size-6" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"min-w-0"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"font-bold text-gray-900 dark:text-white truncate"Tb4b4b4>
Tff7b72{{ Te6edf3contactTb4b4b4.Te6edf3name Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-[10px] text-gray-500 dark:text-zinc-500 font-mono truncate"Tb4b4b4>
Tff7b72{{ Te6edf3contactTb4b4b4.Te6edf3remote_identity_hash Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3contactTb4b4b4.Te6edf3lxmf_addressTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"text-[9px] text-gray-400 dark:text-zinc-500 font-mono truncate"
Tb4b4b4>
LXMF: Tff7b72{{ Te6edf3contactTb4b4b4.Te6edf3lxmf_address Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3contactTb4b4b4.Te6edf3lxst_addressTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"text-[9px] text-gray-400 dark:text-zinc-500 font-mono truncate"
Tb4b4b4>
LXST: Tff7b72{{ Te6edf3contactTb4b4b4.Te6edf3lxst_address Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- chat items -->
Tb4b4b4<Tff7b72div
Te6edf3idTff7b72=Ta5d6ff"messages"
Te6edf3classTff7b72=Ta5d6ff"h-full overflow-y-scroll bg-gray-50/30 dark:bg-zinc-950/50"
Tb4b4b4@Te6edf3scrollTff7b72=Ta5d6ff"Te6edf3onMessagesScrollTa5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3selectedPeerChatItemsTb4b4b4.Te6edf3length Tff7b72> T79c0ff0Ta5d6ff" Te6edf3classTff7b72=Ta5d6ff"flex flex-col flex-col-reverse px-4 py-6 min-w-0"Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3v-forTff7b72=Ta5d6ff"Te6edf3chatItem Tff7b72of Te6edf3selectedPeerChatItemsReversedTa5d6ff"
Tb4b4b4:Te6edf3idTff7b72=Ta5d6ff"Ta5d6ff`Ta5d6ffmessage-Tffd700${Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hashTffd700}Ta5d6ff`Ta5d6ff"
Tb4b4b4:Te6edf3keyTff7b72=Ta5d6ff"Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hashTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"flex flex-col max-w-[85%] sm:max-w-[75%] lg:max-w-[65%] mb-4 group min-w-0"
Tb4b4b4:Te6edf3classTff7b72=Ta5d6ff"Tb4b4b4{ Ta5d6ff'ml-auto items-end'Tff7b72: Te6edf3chatItemTb4b4b4.Te6edf3is_outboundTb4b4b4, Ta5d6ff'mr-auto items-start'Tff7b72: Tff7b72!Te6edf3chatItemTb4b4b4.Te6edf3is_outbound Tb4b4b4}Ta5d6ff"
Tb4b4b4@Te6edf3contextmenuTb4b4b4.Te6edf3preventTff7b72=Ta5d6ff"Te6edf3onMessageContextMenuTb4b4b4(Te6edf3$eventTb4b4b4, Te6edf3chatItemTb4b4b4)Ta5d6ff"
Tb4b4b4>
T8b949e<!-- message content -->
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"relative rounded-2xl overflow-hidden transition-all duration-200 hover:shadow-md min-w-0"
Tb4b4b4:Te6edf3classTff7b72=Ta5d6ff"Tb4b4b4[
Tb4b4b4[Ta5d6ff'cancelled'Tb4b4b4, Ta5d6ff'failed'Tb4b4b4]Tb4b4b4.Te6edf3includesTb4b4b4(Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3stateTb4b4b4)
Tff7b72? Ta5d6ff'shadow-sm'
Tff7b72: Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3is_spam
Tff7b72? Ta5d6ff'bg-yellow-100 dark:bg-yellow-900/30 text-yellow-900 dark:text-yellow-100 border border-yellow-300 dark:border-yellow-700 shadow-sm'
Tff7b72: Te6edf3chatItemTb4b4b4.Te6edf3is_outbound
Tff7b72? Ta5d6ff'shadow-sm'
Tff7b72: Ta5d6ff'bg-white dark:bg-zinc-900 text-gray-900 dark:text-zinc-100 border border-gray-200/60 dark:border-zinc-800/60 shadow-sm'Tb4b4b4,
Tb4b4b4]Ta5d6ff"
Tb4b4b4:Te6edf3styleTff7b72=Ta5d6ff"Te6edf3bubbleStylesTb4b4b4(Te6edf3chatItemTb4b4b4)Ta5d6ff"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3onChatItemClickTb4b4b4(Te6edf3chatItemTb4b4b4)Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"w-full space-y-1 px-4 py-2.5 min-w-0"Tb4b4b4>
T8b949e<!-- reply snippet -->
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3reply_to_hashTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"mb-2 p-2 rounded-lg bg-black/5 dark:bg-white/5 border-l-2 border-blue-500/50 cursor-pointer hover:bg-black/10 dark:hover:bg-white/10 transition-colors"
Tb4b4b4@Te6edf3clickTb4b4b4.Te6edf3stopTff7b72=Ta5d6ff"Te6edf3scrollToMessageTb4b4b4(Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3reply_to_hashTb4b4b4)Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-1 text-[10px] font-bold uppercase tracking-tight mb-0.5"
Tb4b4b4:Te6edf3classTff7b72=Ta5d6ff"Te6edf3chatItemTb4b4b4.Te6edf3is_outbound Tff7b72? Ta5d6ff'text-white/80' Tff7b72: Ta5d6ff'text-indigo-500/80'Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"reply" Te6edf3classTff7b72=Ta5d6ff"size-3" Tb4b4b4/Tb4b4b4>
Tff7b72{{ Te6edf3$tTb4b4b4(Ta5d6ff"messages.replying_to"Tb4b4b4) Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-xs opacity-70 truncate line-clamp-1 italic"Tb4b4b4>
Tff7b72{{
Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTff7b72?Tb4b4b4.Te6edf3reply_quoted_content Tff7b72||
Te6edf3getRepliedMessageTb4b4b4(Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3reply_to_hashTb4b4b4)Tff7b72?Tb4b4b4.Te6edf3content Tff7b72||
Tb4b4b4(Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3reply_to_hash
Tff7b72? Ta5d6ff`Ta5d6ffMessage <Tffd700${Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3reply_to_hashTb4b4b4.Te6edf3substringTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff8Tb4b4b4)Tffd700}Ta5d6ff...>Ta5d6ff`
Tff7b72: Ta5d6ff"(Message not found)"Tb4b4b4)
Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- spam badge -->
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3is_spamTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-1.5 text-xs font-medium mb-1"
Tb4b4b4:Te6edf3classTff7b72=Ta5d6ff"
Te6edf3chatItemTb4b4b4.Te6edf3is_outbound Tff7b72? Ta5d6ff'text-orange-200' Tff7b72: Ta5d6ff'text-orange-700 dark:text-orange-300'
Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"alert-decagram" Te6edf3classTff7b72=Ta5d6ff"size-4" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72spanTb4b4b4>Marked as SpamTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- content -->
T8b949e<!-- eslint-disable vue/no-v-html -->
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3content Tff7b72&& Tff7b72!Te6edf3getParsedItemsTb4b4b4(Te6edf3chatItemTb4b4b4)Tff7b72?Tb4b4b4.Te6edf3isOnlyPaperMessageTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"leading-relaxed break-words [word-break:break-word] min-w-0 markdown-content"
Tb4b4b4:Te6edf3styleTff7b72=Ta5d6ff"Tb4b4b4{
Ta5d6ff'font-family'Tff7b72: Ta5d6ff'inherit'Tb4b4b4,
Ta5d6ff'font-size'Tff7b72: Tb4b4b4(Te6edf3configTff7b72?Tb4b4b4.Te6edf3message_font_size Tff7b72|| T79c0ff14Tb4b4b4) Tff7b72+ Ta5d6ff'px'Tb4b4b4,
Tb4b4b4}Ta5d6ff"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3handleMessageClickTa5d6ff"
Te6edf3v-htmlTff7b72=Ta5d6ff"Te6edf3renderMarkdownTb4b4b4(Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3contentTb4b4b4)Ta5d6ff"
Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- eslint-enable vue/no-v-html -->
T8b949e<!-- telemetry placeholder for empty content messages -->
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Tff7b72!Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3content Tff7b72&& Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTff7b72?Tb4b4b4.Te6edf3telemetryTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2 mb-2 pb-2 border-b border-gray-100/20"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"satellite-variant" Te6edf3classTff7b72=Ta5d6ff"size-4 opacity-60" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-[10px] font-bold uppercase tracking-wider opacity-60"Tb4b4b4>
Tff7b72{{ Te6edf3chatItemTb4b4b4.Te6edf3is_outbound Tff7b72? Ta5d6ff"Telemetry update sent" Tff7b72: Ta5d6ff"Telemetry update received" Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Tff7b72!Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3content Tff7b72&& Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTff7b72?Tb4b4b4.Te6edf3telemetry_streamTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2 mb-2 pb-2 border-b border-gray-100/20"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"database-sync" Te6edf3classTff7b72=Ta5d6ff"size-4 opacity-60" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-[10px] font-bold uppercase tracking-wider opacity-60"
Tb4b4b4>Telemetry stream received (Tff7b72{{
Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3telemetry_streamTb4b4b4.Te6edf3length
Tff7b72}}
entries)Tb4b4b4<Tb4b4b4/Tff7b72span
Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"
Tff7b72!Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3content Tff7b72&&
Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTff7b72?Tb4b4b4.Te6edf3commandsTff7b72?Tb4b4b4.Te6edf3someTb4b4b4(Tb4b4b4(Te6edf3cTb4b4b4) Tb4b4b4=> Te6edf3cTb4b4b4[Ta5d6ff'0x01'Tb4b4b4] Tff7b72|| Te6edf3cTb4b4b4[Ta5d6ff'1'Tb4b4b4] Tff7b72|| Te6edf3cTb4b4b4[Ta5d6ff'0x1'Tb4b4b4]Tb4b4b4)
Ta5d6ff"
Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2 mb-2 pb-2 border-b border-gray-100/20"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"crosshairs-question" Te6edf3classTff7b72=Ta5d6ff"size-4 opacity-60" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-[10px] font-bold uppercase tracking-wider opacity-60"Tb4b4b4>
Tff7b72{{ Te6edf3chatItemTb4b4b4.Te6edf3is_outbound Tff7b72? Ta5d6ff"Location Request Sent" Tff7b72: Ta5d6ff"Location Request Received" Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- parsed items (contacts / paper messages) -->
Tb4b4b4<Tff7b72div Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3getParsedItemsTb4b4b4(Te6edf3chatItemTb4b4b4)Ta5d6ff" Te6edf3classTff7b72=Ta5d6ff"mt-2 space-y-2"Tb4b4b4>
T8b949e<!-- contact -->
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3getParsedItemsTb4b4b4(Te6edf3chatItemTb4b4b4)Tb4b4b4.Te6edf3contact Tff7b72&& Tff7b72!Te6edf3chatItemTb4b4b4.Te6edf3is_outboundTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"flex flex-col gap-2 p-3 rounded-xl bg-blue-50 dark:bg-blue-900/20 border border-blue-100 dark:border-blue-800/30"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2 text-blue-700 dark:text-blue-300"Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"account-plus-outline" Te6edf3classTff7b72=Ta5d6ff"size-5" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-sm font-bold"Tb4b4b4>Contact SharedTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-3"Tb4b4b4>
Tb4b4b4<Tff7b72LxmfUserIcon
Tb4b4b4:Te6edf3custom-imageTff7b72=Ta5d6ff"Te6edf3getParsedItemsTb4b4b4(Te6edf3chatItemTb4b4b4)Tb4b4b4.Te6edf3contactTb4b4b4.Te6edf3custom_imageTa5d6ff"
Tb4b4b4:Te6edf3icon-nameTff7b72=Ta5d6ff"Te6edf3getParsedItemsTb4b4b4(Te6edf3chatItemTb4b4b4)Tb4b4b4.Te6edf3contactTb4b4b4.Te6edf3lxmf_user_iconTff7b72?Tb4b4b4.Te6edf3icon_nameTa5d6ff"
Tb4b4b4:Te6edf3icon-foreground-colourTff7b72=Ta5d6ff"
Te6edf3getParsedItemsTb4b4b4(Te6edf3chatItemTb4b4b4)Tb4b4b4.Te6edf3contactTb4b4b4.Te6edf3lxmf_user_iconTff7b72?Tb4b4b4.Te6edf3foreground_colour
Ta5d6ff"
Tb4b4b4:Te6edf3icon-background-colourTff7b72=Ta5d6ff"
Te6edf3getParsedItemsTb4b4b4(Te6edf3chatItemTb4b4b4)Tb4b4b4.Te6edf3contactTb4b4b4.Te6edf3lxmf_user_iconTff7b72?Tb4b4b4.Te6edf3background_colour
Ta5d6ff"
Te6edf3icon-classTff7b72=Ta5d6ff"size-10"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex-1 min-w-0"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-sm font-bold text-gray-900 dark:text-white truncate"Tb4b4b4>
Tff7b72{{ Te6edf3getParsedItemsTb4b4b4(Te6edf3chatItemTb4b4b4)Tb4b4b4.Te6edf3contactTb4b4b4.Te6edf3name Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"text-[10px] font-mono text-gray-500 dark:text-zinc-400 truncate"
Tb4b4b4>
Tff7b72{{ Te6edf3getParsedItemsTb4b4b4(Te6edf3chatItemTb4b4b4)Tb4b4b4.Te6edf3contactTb4b4b4.Te6edf3hash Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3getParsedItemsTb4b4b4(Te6edf3chatItemTb4b4b4)Tb4b4b4.Te6edf3contactTb4b4b4.Te6edf3lxmf_addressTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"text-[9px] font-mono text-gray-400 dark:text-zinc-500 truncate"
Tb4b4b4>
LXMF: Tff7b72{{ Te6edf3getParsedItemsTb4b4b4(Te6edf3chatItemTb4b4b4)Tb4b4b4.Te6edf3contactTb4b4b4.Te6edf3lxmf_address Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3getParsedItemsTb4b4b4(Te6edf3chatItemTb4b4b4)Tb4b4b4.Te6edf3contactTb4b4b4.Te6edf3lxst_addressTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"text-[9px] font-mono text-gray-400 dark:text-zinc-500 truncate"
Tb4b4b4>
LXST: Tff7b72{{ Te6edf3getParsedItemsTb4b4b4(Te6edf3chatItemTb4b4b4)Tb4b4b4.Te6edf3contactTb4b4b4.Te6edf3lxst_address Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"w-full py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-lg text-xs font-bold transition-colors shadow-sm"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"
Te6edf3addContactTb4b4b4(
Te6edf3getParsedItemsTb4b4b4(Te6edf3chatItemTb4b4b4)Tb4b4b4.Te6edf3contactTb4b4b4.Te6edf3nameTb4b4b4,
Te6edf3getParsedItemsTb4b4b4(Te6edf3chatItemTb4b4b4)Tb4b4b4.Te6edf3contactTb4b4b4.Te6edf3hashTb4b4b4,
Te6edf3getParsedItemsTb4b4b4(Te6edf3chatItemTb4b4b4)Tb4b4b4.Te6edf3contactTb4b4b4.Te6edf3lxmf_addressTb4b4b4,
Te6edf3getParsedItemsTb4b4b4(Te6edf3chatItemTb4b4b4)Tb4b4b4.Te6edf3contactTb4b4b4.Te6edf3lxst_address
Tb4b4b4)
Ta5d6ff"
Tb4b4b4>
Add to Contacts
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- paper message auto-conversion -->
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3getParsedItemsTb4b4b4(Te6edf3chatItemTb4b4b4)Tb4b4b4.Te6edf3paperMessage Tff7b72&& Tff7b72!Te6edf3chatItemTb4b4b4.Te6edf3is_outboundTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"flex flex-col gap-2 p-3 rounded-xl bg-emerald-50 dark:bg-black/60 border border-emerald-100 dark:border-zinc-700/50"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2 text-emerald-700 dark:text-emerald-400"Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"qrcode-scan" Te6edf3classTff7b72=Ta5d6ff"size-5" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-sm font-bold"Tb4b4b4>Paper Message detectedTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72p Te6edf3classTff7b72=Ta5d6ff"text-xs text-emerald-600/80 dark:text-zinc-400 leading-relaxed"Tb4b4b4>
This message contains a signed LXMF URI that can be ingested into your
conversations.
Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"w-full py-2 bg-emerald-600 hover:bg-emerald-700 text-white rounded-lg text-xs font-bold transition-colors shadow-sm"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3ingestPaperMessageTb4b4b4(Te6edf3getParsedItemsTb4b4b4(Te6edf3chatItemTb4b4b4)Tb4b4b4.Te6edf3paperMessageTb4b4b4)Ta5d6ff"
Tb4b4b4>
Ingest Message
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- image field -->
Tb4b4b4<Tff7b72div Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTff7b72?Tb4b4b4.Te6edf3imageTa5d6ff" Te6edf3classTff7b72=Ta5d6ff"relative group mt-1 -mx-1"Tb4b4b4>
Tb4b4b4<Tff7b72img
Tb4b4b4:Te6edf3srcTff7b72=Ta5d6ff"Ta5d6ff`Ta5d6ff/api/v1/lxmf-messages/attachment/Tffd700${Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hashTffd700}Ta5d6ff/imageTa5d6ff`Ta5d6ff"
Te6edf3classTff7b72=Ta5d6ff"max-w-[240px] sm:max-w-xs w-full rounded-lg cursor-pointer transition-transform group-hover:scale-[1.01]"
Tb4b4b4@Te6edf3clickTb4b4b4.Te6edf3stopTff7b72=Ta5d6ff"
Te6edf3openImageTb4b4b4(
Ta5d6ff`Ta5d6ff/api/v1/lxmf-messages/attachment/Tffd700${Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hashTffd700}Ta5d6ff/imageTa5d6ff`
Tb4b4b4)
Ta5d6ff"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"absolute bottom-2 left-2 bg-black/60 backdrop-blur-sm text-white text-xs px-2.5 py-1 rounded-lg flex items-center gap-1.5"
Tb4b4b4>
Tb4b4b4<Tff7b72spanTb4b4b4>Tff7b72{{
Tb4b4b4(Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3imageTb4b4b4.Te6edf3image_type Tff7b72?? Ta5d6ff"image"Tb4b4b4)Tb4b4b4.Te6edf3toUpperCaseTb4b4b4(Tb4b4b4)
Tff7b72}}Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tff7b72spanTb4b4b4>•Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tff7b72spanTb4b4b4>Tff7b72{{ Te6edf3formatAttachmentSizeTb4b4b4(Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3imageTb4b4b4, Ta5d6ff"image"Tb4b4b4) Tff7b72}}Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- audio field -->
Tb4b4b4<Tff7b72div Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTff7b72?Tb4b4b4.Te6edf3audioTa5d6ff" Te6edf3classTff7b72=Ta5d6ff"pb-1"Tb4b4b4>
T8b949e<!-- audio is loaded -->
Tb4b4b4<Tff7b72AudioWaveformPlayer
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3lxmfMessageAudioAttachmentCacheTb4b4b4[Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hashTb4b4b4]Ta5d6ff"
Tb4b4b4:Te6edf3srcTff7b72=Ta5d6ff"Te6edf3lxmfMessageAudioAttachmentCacheTb4b4b4[Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hashTb4b4b4]Ta5d6ff"
Tb4b4b4:Te6edf3is-outboundTff7b72=Ta5d6ff"Te6edf3chatItemTb4b4b4.Te6edf3is_outboundTa5d6ff"
Tb4b4b4/Tb4b4b4>
T8b949e<!-- audio is not yet loaded -->
Tb4b4b4<Tff7b72div
Te6edf3v-else
Te6edf3classTff7b72=Ta5d6ff"flex items-center justify-center p-2 rounded-xl bg-gray-50/50 dark:bg-zinc-800/50 border border-gray-100 dark:border-zinc-800 min-h-[54px]"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2"Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"size-4 border-2 border-blue-500/20 border-t-blue-500 rounded-full animate-spin"
Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-[10px] font-bold text-gray-400 uppercase tracking-wider"Tb4b4b4>Tff7b72{{
Te6edf3$tTb4b4b4(Ta5d6ff"messages.downloading"Tb4b4b4)
Tff7b72}}Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"text-[10px] mt-1 text-right opacity-60"
Tb4b4b4:Te6edf3classTff7b72=Ta5d6ff"Te6edf3chatItemTb4b4b4.Te6edf3is_outbound Tff7b72? Ta5d6ff'text-white' Tff7b72: Ta5d6ff'text-gray-500 dark:text-zinc-400'Ta5d6ff"
Tb4b4b4>
Voice Note • Tff7b72{{ Te6edf3formatAttachmentSizeTb4b4b4(Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3audioTb4b4b4, Ta5d6ff"audio"Tb4b4b4) Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- file attachment fields -->
Tb4b4b4<Tff7b72div Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTff7b72?Tb4b4b4.Te6edf3file_attachmentsTa5d6ff" Te6edf3classTff7b72=Ta5d6ff"space-y-2 mt-1"Tb4b4b4>
Tb4b4b4<Tff7b72a
Te6edf3v-forTff7b72=Ta5d6ff"Tb4b4b4(Te6edf3file_attachmentTb4b4b4, Te6edf3indexTb4b4b4) Tff7b72of Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTff7b72?Tb4b4b4.Te6edf3file_attachments Tff7b72??
Tb4b4b4[Tb4b4b4]Ta5d6ff"
Tb4b4b4:Te6edf3keyTff7b72=Ta5d6ff"Te6edf3file_attachmentTb4b4b4.Te6edf3file_nameTa5d6ff"
Te6edf3targetTff7b72=Ta5d6ff"_blank"
Tb4b4b4:Te6edf3downloadTff7b72=Ta5d6ff"Te6edf3file_attachmentTb4b4b4.Te6edf3file_nameTa5d6ff"
Tb4b4b4:Te6edf3hrefTff7b72=Ta5d6ff"Ta5d6ff`Ta5d6ff/api/v1/lxmf-messages/attachment/Tffd700${Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hashTffd700}Ta5d6ff/file?file_index=Tffd700${Te6edf3indexTffd700}Ta5d6ff`Ta5d6ff"
Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-3 border rounded-lg px-3 py-2 text-sm font-medium cursor-pointer transition-colors"
Tb4b4b4:Te6edf3classTff7b72=Ta5d6ff"
Te6edf3chatItemTb4b4b4.Te6edf3is_outbound
Tff7b72? Ta5d6ff'bg-white/20 text-white border-white/20 hover:bg-white/30'
Tff7b72: Ta5d6ff'bg-gray-50 dark:bg-zinc-800/50 text-gray-700 dark:text-zinc-300 border-gray-200/60 dark:border-zinc-700 hover:bg-gray-100 dark:hover:bg-zinc-800'
Ta5d6ff"
@Te6edf3click.Te6edf3stop
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"my-auto"Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"paperclip" Te6edf3classTff7b72=Ta5d6ff"size-5" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex-1 min-w-0"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"truncate text-xs font-bold"Tb4b4b4>Tff7b72{{ Te6edf3file_attachmentTb4b4b4.Te6edf3file_name Tff7b72}}Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"text-[10px] font-normal"
Tb4b4b4:Te6edf3classTff7b72=Ta5d6ff"
Te6edf3chatItemTb4b4b4.Te6edf3is_outbound
Tff7b72? Ta5d6ff'text-white/60'
Tff7b72: Ta5d6ff'text-gray-500 dark:text-zinc-400'
Ta5d6ff"
Tb4b4b4>
Tff7b72{{ Te6edf3formatAttachmentSizeTb4b4b4(Te6edf3file_attachmentTb4b4b4, Ta5d6ff"file"Tb4b4b4) Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"my-auto"Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"download" Te6edf3classTff7b72=Ta5d6ff"size-5" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72aTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- commands -->
Tb4b4b4<Tff7b72div Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTff7b72?Tb4b4b4.Te6edf3commandsTa5d6ff" Te6edf3classTff7b72=Ta5d6ff"space-y-2 mt-1"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3v-forTff7b72=Ta5d6ff"Tb4b4b4(Te6edf3commandTb4b4b4, Te6edf3indexTb4b4b4) Tff7b72in Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3commandsTa5d6ff" Tb4b4b4:Te6edf3keyTff7b72=Ta5d6ff"Te6edf3indexTa5d6ff"Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3commandTb4b4b4[Ta5d6ff'0x01'Tb4b4b4] Tff7b72|| Te6edf3commandTb4b4b4[Ta5d6ff'1'Tb4b4b4] Tff7b72|| Te6edf3commandTb4b4b4[Ta5d6ff'0x1'Tb4b4b4]Ta5d6ff"
Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2 border border-gray-200/60 dark:border-zinc-700 hover:bg-gray-50 dark:hover:bg-zinc-800 rounded-lg px-3 py-2 text-sm font-medium transition-colors"
Tb4b4b4:Te6edf3classTff7b72=Ta5d6ff"
Te6edf3chatItemTb4b4b4.Te6edf3is_outbound
Tff7b72? Ta5d6ff'bg-white/20 text-white border-white/20 hover:bg-white/30'
Tff7b72: Ta5d6ff'bg-gray-50 dark:bg-zinc-800/50 text-gray-700 dark:text-zinc-300'
Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"crosshairs-question" Te6edf3classTff7b72=Ta5d6ff"size-5" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-left"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"font-bold text-xs uppercase tracking-wider opacity-80"Tb4b4b4>
Tff7b72{{ Te6edf3$tTb4b4b4(Ta5d6ff"messages.location_requested"Tb4b4b4) Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3v-ifTff7b72=Ta5d6ff"Tff7b72!Te6edf3chatItemTb4b4b4.Te6edf3is_outboundTa5d6ff" Te6edf3classTff7b72=Ta5d6ff"text-[10px] opacity-70"Tb4b4b4>
Peer is requesting your location
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- telemetry / location field -->
Tb4b4b4<Tff7b72div Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTff7b72?Tb4b4b4.Te6edf3telemetryTa5d6ff" Te6edf3classTff7b72=Ta5d6ff"pb-1 mt-1 space-y-2"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex flex-wrap gap-2"Tb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3telemetryTb4b4b4.Te6edf3locationTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2 border border-gray-200/60 dark:border-zinc-700 hover:bg-gray-50 dark:hover:bg-zinc-800 rounded-lg px-3 py-2 text-sm font-medium transition-colors"
Tb4b4b4:Te6edf3classTff7b72=Ta5d6ff"
Te6edf3chatItemTb4b4b4.Te6edf3is_outbound
Tff7b72? Ta5d6ff'bg-white/20 text-white border-white/20 hover:bg-white/30'
Tff7b72: Ta5d6ff'bg-gray-50 dark:bg-zinc-800/50 text-gray-700 dark:text-zinc-300'
Ta5d6ff"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3viewLocationOnMapTb4b4b4(Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3telemetryTb4b4b4.Te6edf3locationTb4b4b4)Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"map-marker" Te6edf3classTff7b72=Ta5d6ff"size-5" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-left"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"font-bold text-[10px] uppercase tracking-wider opacity-80"Tb4b4b4>
Location
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-[9px] font-mono opacity-70"Tb4b4b4>
Tff7b72{{
Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3telemetryTb4b4b4.Te6edf3locationTb4b4b4.Te6edf3latitudeTb4b4b4.Te6edf3toFixedTb4b4b4(T79c0ff6Tb4b4b4)
Tff7b72}},
Tff7b72{{
Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3telemetryTb4b4b4.Te6edf3locationTb4b4b4.Te6edf3longitudeTb4b4b4.Te6edf3toFixedTb4b4b4(T79c0ff6Tb4b4b4)
Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
T8b949e<!-- Live Track Toggle Button (only for incoming) -->
Tb4b4b4<Tff7b72button
Te6edf3v-ifTff7b72=Ta5d6ff"Tff7b72!Te6edf3chatItemTb4b4b4.Te6edf3is_outboundTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2 border border-gray-200/60 dark:border-zinc-700 hover:bg-gray-50 dark:hover:bg-zinc-800 rounded-lg px-3 py-2 text-sm font-medium transition-colors"
Tb4b4b4:Te6edf3classTff7b72=Ta5d6ff"Tb4b4b4[
Te6edf3selectedPeerTff7b72?Tb4b4b4.Te6edf3is_tracking
Tff7b72? Ta5d6ff'bg-blue-500/20 text-blue-600 dark:text-blue-400 border-blue-500/30 shadow-inner'
Tff7b72: Ta5d6ff'bg-gray-50 dark:bg-zinc-800/50 text-gray-700 dark:text-zinc-300'Tb4b4b4,
Tb4b4b4]Ta5d6ff"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3toggleTrackingTb4b4b4(Tb4b4b4)Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon
Tb4b4b4:Te6edf3icon-nameTff7b72=Ta5d6ff"Te6edf3selectedPeerTff7b72?Tb4b4b4.Te6edf3is_tracking Tff7b72? Ta5d6ff'radar' Tff7b72: Ta5d6ff'crosshairs'Ta5d6ff"
Te6edf3classTff7b72=Ta5d6ff"size-5"
Tb4b4b4:Te6edf3classTff7b72=Ta5d6ff"Tb4b4b4{ Ta5d6ff'animate-pulse text-blue-500'Tff7b72: Te6edf3selectedPeerTff7b72?Tb4b4b4.Te6edf3is_tracking Tb4b4b4}Ta5d6ff"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-left"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"font-bold text-[10px] uppercase tracking-wider opacity-80"Tb4b4b4>
Tff7b72{{ Te6edf3selectedPeerTff7b72?Tb4b4b4.Te6edf3is_tracking Tff7b72? Ta5d6ff"Tracking Active" Tff7b72: Ta5d6ff"Live Track" Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-[9px] opacity-70"Tb4b4b4>
Tff7b72{{
Te6edf3selectedPeerTff7b72?Tb4b4b4.Te6edf3is_tracking
Tff7b72? Ta5d6ff"Auto-requesting location"
Tff7b72: Ta5d6ff"Enable live tracking"
Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- other sensor data if available -->
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"
Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3telemetryTb4b4b4.Te6edf3battery Tff7b72||
Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3telemetryTb4b4b4.Te6edf3physical_link
Ta5d6ff"
Te6edf3classTff7b72=Ta5d6ff"flex gap-3 px-1"
Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3telemetryTb4b4b4.Te6edf3batteryTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-1 opacity-60 text-[10px]"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"battery" Te6edf3classTff7b72=Ta5d6ff"size-3" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72span
Tb4b4b4>Tff7b72{{ Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3telemetryTb4b4b4.Te6edf3batteryTb4b4b4.Te6edf3charge_percent Tff7b72}}%Tb4b4b4<Tb4b4b4/Tff7b72span
Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3telemetryTb4b4b4.Te6edf3physical_linkTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-1 opacity-60 text-[10px]"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"antenna" Te6edf3classTff7b72=Ta5d6ff"size-3" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72span
Tb4b4b4>SNR: Tff7b72{{ Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3telemetryTb4b4b4.Te6edf3physical_linkTb4b4b4.Te6edf3snr Tff7b72}}dBTb4b4b4<Tb4b4b4/Tff7b72span
Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- message footer: timestamp and status icons -->
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex items-center justify-end gap-1.5 mt-1.5 select-none h-3"Tb4b4b4>
Tb4b4b4<Tff7b72span
Te6edf3classTff7b72=Ta5d6ff"text-[9px] opacity-80 font-medium"
Tb4b4b4:Te6edf3classTff7b72=Ta5d6ff"Te6edf3chatItemTb4b4b4.Te6edf3is_outbound Tff7b72? Ta5d6ff'text-white/90' Tff7b72: Ta5d6ff'text-gray-500 dark:text-zinc-400'Ta5d6ff"
Tb4b4b4:Te6edf3titleTff7b72=Ta5d6ff"Te6edf3getMessageInfoLinesTb4b4b4(Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4, Te6edf3chatItemTb4b4b4.Te6edf3is_outboundTb4b4b4)Tb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff'\n'Tb4b4b4)Ta5d6ff"
Tb4b4b4>
Tff7b72{{ Te6edf3formatTimeAgoTb4b4b4(Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3created_atTb4b4b4) Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
T8b949e<!-- outbound status icons -->
Tb4b4b4<Tff7b72div Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3chatItemTb4b4b4.Te6edf3is_outboundTa5d6ff" Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-1"Tb4b4b4>
Tb4b4b4<Tff7b72span
Te6edf3v-ifTff7b72=Ta5d6ff"Tb4b4b4[Ta5d6ff'failed'Tb4b4b4, Ta5d6ff'cancelled'Tb4b4b4, Ta5d6ff'rejected'Tb4b4b4]Tb4b4b4.Te6edf3includesTb4b4b4(Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3stateTb4b4b4)Ta5d6ff"
Te6edf3classTff7b72=Ta5d6ff"text-[9px] font-bold uppercase tracking-wider text-white"
Tb4b4b4>
Tff7b72{{ Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3state Tff7b72=== Ta5d6ff"rejected" Tff7b72? Ta5d6ff"Rejected" Tff7b72: Ta5d6ff"Failed" Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
T8b949e<!-- delivered: double check -->
Tb4b4b4<Tff7b72MaterialDesignIcon
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3state Tff7b72=== Ta5d6ff'delivered'Ta5d6ff"
Te6edf3icon-nameTff7b72=Ta5d6ff"check-all"
Te6edf3classTff7b72=Ta5d6ff"size-3 text-blue-300"
Te6edf3titleTff7b72=Ta5d6ff"Delivered"
Tb4b4b4/Tb4b4b4>
T8b949e<!-- sent: single check (include unknown for initial outbound when server confirmed creation) -->
Tb4b4b4<Tff7b72MaterialDesignIcon
Te6edf3v-else-ifTff7b72=Ta5d6ff"
Tb4b4b4[Ta5d6ff'sent'Tb4b4b4, Ta5d6ff'propagated'Tb4b4b4, Ta5d6ff'unknown'Tb4b4b4]Tb4b4b4.Te6edf3includesTb4b4b4(Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3stateTb4b4b4)
Ta5d6ff"
Te6edf3icon-nameTff7b72=Ta5d6ff"check"
Te6edf3classTff7b72=Ta5d6ff"size-3 text-white/90"
Tb4b4b4:Te6edf3titleTff7b72=Ta5d6ff"
Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3state Tff7b72=== Ta5d6ff'propagated'
Tff7b72? Ta5d6ff'Sent to propagation node'
Tff7b72: Ta5d6ff'Sent'
Ta5d6ff"
Tb4b4b4/Tb4b4b4>
T8b949e<!-- pending/sending/generating: clock or loading -->
Tb4b4b4<Tff7b72MaterialDesignIcon
Te6edf3v-else-ifTff7b72=Ta5d6ff"
Tb4b4b4[Ta5d6ff'outbound'Tb4b4b4, Ta5d6ff'sending'Tb4b4b4, Ta5d6ff'generating'Tb4b4b4]Tb4b4b4.Te6edf3includesTb4b4b4(Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3stateTb4b4b4)
Ta5d6ff"
Te6edf3icon-nameTff7b72=Ta5d6ff"clock-outline"
Te6edf3classTff7b72=Ta5d6ff"size-3 text-white/60"
Tb4b4b4:Te6edf3titleTff7b72=Ta5d6ff"
Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3state Tff7b72=== Ta5d6ff'sending'
Tff7b72? Ta5d6ff`Ta5d6ffSending... Tffd700${Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3progressTb4b4b4.Te6edf3toFixedTb4b4b4(T79c0ff0Tb4b4b4)Tffd700}Ta5d6ff%Ta5d6ff`
Tff7b72: Ta5d6ff'Pending'
Ta5d6ff"
Tb4b4b4/Tb4b4b4>
T8b949e<!-- failed/cancelled/rejected: alert -->
Tb4b4b4<Tff7b72MaterialDesignIcon
Te6edf3v-else-ifTff7b72=Ta5d6ff"
Tb4b4b4[Ta5d6ff'failed'Tb4b4b4, Ta5d6ff'cancelled'Tb4b4b4, Ta5d6ff'rejected'Tb4b4b4]Tb4b4b4.Te6edf3includesTb4b4b4(Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3stateTb4b4b4)
Ta5d6ff"
Te6edf3icon-nameTff7b72=Ta5d6ff"alert-circle-outline"
Te6edf3classTff7b72=Ta5d6ff"size-3 text-white"
Tb4b4b4:Te6edf3titleTff7b72=Ta5d6ff"Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3stateTa5d6ff"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- actions (expanded) -->
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3chatItemTb4b4b4.Te6edf3is_actions_expandedTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"border-t px-4 py-2.5"
Tb4b4b4:Te6edf3classTff7b72=Ta5d6ff"
Te6edf3chatItemTb4b4b4.Te6edf3is_outbound
Tff7b72? Ta5d6ff'border-white/20 bg-white/10'
Tff7b72: Ta5d6ff'border-gray-200/60 dark:border-zinc-800/60 bg-gray-50/50 dark:bg-zinc-900/50'
Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2"Tb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"inline-flex items-center gap-x-1.5 rounded-lg bg-blue-500 px-3 py-1.5 text-xs font-semibold text-white shadow-sm hover:bg-blue-600 transition-colors"
Tb4b4b4@Te6edf3clickTb4b4b4.Te6edf3stopTff7b72=Ta5d6ff"Te6edf3replyToMessageTb4b4b4(Te6edf3chatItemTb4b4b4)Ta5d6ff"
Tb4b4b4>
Tff7b72{{ Te6edf3$tTb4b4b4(Ta5d6ff"messages.reply"Tb4b4b4) Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"inline-flex items-center gap-x-1.5 rounded-lg bg-red-500 px-3 py-1.5 text-xs font-semibold text-white shadow-sm hover:bg-red-600 transition-colors"
Tb4b4b4@Te6edf3clickTb4b4b4.Te6edf3stopTff7b72=Ta5d6ff"Te6edf3deleteChatItemTb4b4b4(Te6edf3chatItemTb4b4b4)Ta5d6ff"
Tb4b4b4>
Delete
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"inline-flex items-center gap-x-1.5 rounded-lg bg-gray-600 px-3 py-1.5 text-xs font-semibold text-white shadow-sm hover:bg-gray-700 transition-colors"
Tb4b4b4@Te6edf3clickTb4b4b4.Te6edf3stopTff7b72=Ta5d6ff"Te6edf3showRawMessageTb4b4b4(Te6edf3chatItemTb4b4b4)Ta5d6ff"
Tb4b4b4>
Raw LXM
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- expanded message details -->
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3expandedMessageInfo Tff7b72=== Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hashTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"mt-2 px-1 text-xs text-gray-500 dark:text-zinc-400 space-y-0.5"
Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3v-forTff7b72=Ta5d6ff"Tb4b4b4(Te6edf3lineTb4b4b4, Te6edf3indexTb4b4b4) Tff7b72in Te6edf3getMessageInfoLinesTb4b4b4(Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4, Te6edf3chatItemTb4b4b4.Te6edf3is_outboundTb4b4b4)Ta5d6ff"
Tb4b4b4:Te6edf3keyTff7b72=Ta5d6ff"Te6edf3indexTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"break-all"
Tb4b4b4>
Tff7b72{{ Te6edf3line Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- load previous -->
Tb4b4b4<Tff7b72button
Te6edf3v-showTff7b72=Ta5d6ff"Tff7b72!Te6edf3isLoadingPrevious Tff7b72&& Te6edf3hasMorePreviousTa5d6ff"
Te6edf3idTff7b72=Ta5d6ff"load-previous"
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2 mx-auto mt-4 bg-white dark:bg-zinc-900 border border-gray-200 dark:border-zinc-800 px-4 py-2 hover:bg-gray-50 dark:hover:bg-zinc-800 rounded-full shadow-sm text-sm font-medium text-gray-700 dark:text-zinc-300 transition-colors"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3loadPreviousTa5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72svg
Te6edf3xmlnsTff7b72=Ta5d6ff"http://www.w3.org/2000/svg"
Te6edf3fillTff7b72=Ta5d6ff"none"
Te6edf3viewBoxTff7b72=Ta5d6ff"0 0 24 24"
Te6edf3stroke-widthTff7b72=Ta5d6ff"1.5"
Te6edf3strokeTff7b72=Ta5d6ff"currentColor"
Te6edf3classTff7b72=Ta5d6ff"w-4 h-4"
Tb4b4b4>
Tb4b4b4<Tff7b72path
Te6edf3stroke-linecapTff7b72=Ta5d6ff"round"
Te6edf3stroke-linejoinTff7b72=Ta5d6ff"round"
Te6edf3dTff7b72=Ta5d6ff"m15 11.25-3-3m0 0-3 3m3-3v7.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72svgTb4b4b4>
Tb4b4b4<Tff7b72spanTb4b4b4>Load PreviousTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- send message -->
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"w-full border-t border-gray-200/60 dark:border-zinc-800/60 bg-white/80 dark:bg-zinc-900/50 backdrop-blur-sm px-3 sm:px-4 py-2.5"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"w-full"Tb4b4b4>
T8b949e<!-- banished user notification -->
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3isSelectedPeerBlockedTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"mb-3 p-3 bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded-lg flex items-center gap-2"
Tb4b4b4>
Tb4b4b4<Tff7b72svg
Te6edf3xmlnsTff7b72=Ta5d6ff"http://www.w3.org/2000/svg"
Te6edf3fillTff7b72=Ta5d6ff"none"
Te6edf3viewBoxTff7b72=Ta5d6ff"0 0 24 24"
Te6edf3stroke-widthTff7b72=Ta5d6ff"2"
Te6edf3strokeTff7b72=Ta5d6ff"currentColor"
Te6edf3classTff7b72=Ta5d6ff"w-5 h-5 text-yellow-600 dark:text-yellow-400 flex-shrink-0"
Tb4b4b4>
Tb4b4b4<Tff7b72path
Te6edf3stroke-linecapTff7b72=Ta5d6ff"round"
Te6edf3stroke-linejoinTff7b72=Ta5d6ff"round"
Te6edf3dTff7b72=Ta5d6ff"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72svgTb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-sm text-yellow-800 dark:text-yellow-200"
Tb4b4b4>You have banished this user. They cannot send you messages or establish links.Tb4b4b4<Tb4b4b4/Tff7b72span
Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- message composer -->
Tb4b4b4<Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"space-y-2 mb-2"Tb4b4b4>
T8b949e<!-- image attachments -->
Tb4b4b4<Tff7b72div Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3newMessageImagesTb4b4b4.Te6edf3length Tff7b72> T79c0ff0Ta5d6ff" Te6edf3classTff7b72=Ta5d6ff"flex flex-wrap gap-2"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3v-forTff7b72=Ta5d6ff"Tb4b4b4(Te6edf3imageTb4b4b4, Te6edf3indexTb4b4b4) Tff7b72in Te6edf3newMessageImagesTa5d6ff" Tb4b4b4:Te6edf3keyTff7b72=Ta5d6ff"Te6edf3indexTa5d6ff" Te6edf3classTff7b72=Ta5d6ff"relative group"Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"w-20 h-20 sm:w-24 sm:h-24 overflow-hidden rounded-xl bg-gray-100 dark:bg-zinc-800 cursor-pointer border border-gray-200 dark:border-zinc-800 shadow-sm"
Tb4b4b4@Te6edf3clickTb4b4b4.Te6edf3stopTff7b72=Ta5d6ff"Te6edf3openImageTb4b4b4(Te6edf3newMessageImageUrlsTb4b4b4[Te6edf3indexTb4b4b4]Tb4b4b4)Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72img
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3newMessageImageUrlsTb4b4b4[Te6edf3indexTb4b4b4]Ta5d6ff"
Tb4b4b4:Te6edf3srcTff7b72=Ta5d6ff"Te6edf3newMessageImageUrlsTb4b4b4[Te6edf3indexTb4b4b4]Ta5d6ff"
Te6edf3classTff7b72=Ta5d6ff"w-full h-full object-cover"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"absolute -top-1 -right-1 inline-flex items-center justify-center w-5 h-5 rounded-full bg-white dark:bg-zinc-900 border border-gray-200 dark:border-zinc-800 text-gray-600 dark:text-gray-200 hover:bg-red-100 hover:text-red-600 dark:hover:bg-red-900/40 shadow-sm transition-all opacity-100 sm:opacity-0 group-hover:opacity-100"
Tb4b4b4@Te6edf3clickTb4b4b4.Te6edf3stopTff7b72=Ta5d6ff"Te6edf3removeImageAttachmentTb4b4b4(Te6edf3indexTb4b4b4)Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"close" Te6edf3classTff7b72=Ta5d6ff"w-3 h-3" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"absolute bottom-0 left-0 right-0 p-1 bg-black/40 text-white text-[9px] text-center rounded-b-xl backdrop-blur-sm pointer-events-none opacity-0 group-hover:opacity-100 transition-opacity hidden sm:block"
Tb4b4b4>
Tff7b72{{ Te6edf3formatBytesTb4b4b4(Te6edf3imageTb4b4b4.Te6edf3sizeTb4b4b4) Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- audio attachment -->
Tb4b4b4<Tff7b72div Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3newMessageAudioTa5d6ff" Te6edf3classTff7b72=Ta5d6ff"attachment-card"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"attachment-card__body w-full"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"attachment-card__title"Tb4b4b4>Voice NoteTb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"attachment-card__meta mb-2"Tb4b4b4>
Tff7b72{{ Te6edf3formatBytesTb4b4b4(Te6edf3newMessageAudioTb4b4b4.Te6edf3audio_blobTb4b4b4.Te6edf3sizeTb4b4b4) Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72AudioWaveformPlayer Tb4b4b4:Te6edf3srcTff7b72=Ta5d6ff"Te6edf3newMessageAudioTb4b4b4.Te6edf3audio_preview_urlTa5d6ff" Tb4b4b4:Te6edf3is-outboundTff7b72=Ta5d6ff"Tff7b72trueTa5d6ff" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72button Te6edf3typeTff7b72=Ta5d6ff"button" Te6edf3classTff7b72=Ta5d6ff"attachment-card__remove" Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3removeAudioAttachmentTa5d6ff"Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"delete" Te6edf3classTff7b72=Ta5d6ff"w-4 h-4" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- file attachments -->
Tb4b4b4<Tff7b72div Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3newMessageFilesTb4b4b4.Te6edf3length Tff7b72> T79c0ff0Ta5d6ff" Te6edf3classTff7b72=Ta5d6ff"flex flex-wrap gap-2"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3v-forTff7b72=Ta5d6ff"Te6edf3file Tff7b72in Te6edf3newMessageFilesTa5d6ff" Tb4b4b4:Te6edf3keyTff7b72=Ta5d6ff"Te6edf3fileTb4b4b4.Te6edf3name Tff7b72+ Te6edf3fileTb4b4b4.Te6edf3sizeTa5d6ff" Te6edf3classTff7b72=Ta5d6ff"attachment-chip"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2"Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon
Te6edf3icon-nameTff7b72=Ta5d6ff"paperclip"
Te6edf3classTff7b72=Ta5d6ff"w-4 h-4 text-gray-500 dark:text-gray-300"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-sm text-gray-800 dark:text-gray-200 truncate max-w-[160px]"Tb4b4b4>
Tff7b72{{ Te6edf3fileTb4b4b4.Te6edf3name Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-xs text-gray-500 dark:text-gray-400"Tb4b4b4>Tff7b72{{
Te6edf3formatBytesTb4b4b4(Te6edf3fileTb4b4b4.Te6edf3sizeTb4b4b4)
Tff7b72}}Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"attachment-chip__remove"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3removeFileAttachmentTb4b4b4(Te6edf3fileTb4b4b4)Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"close" Te6edf3classTff7b72=Ta5d6ff"w-3.5 h-3.5" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- text input -->
Tb4b4b4<Tff7b72textarea
Te6edf3idTff7b72=Ta5d6ff"message-input"
Te6edf3refTff7b72=Ta5d6ff"message-input"
Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3newMessageTextTa5d6ff"
Tb4b4b4:Te6edf3readonlyTff7b72=Ta5d6ff"Te6edf3isSendingMessageTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"bg-white dark:bg-zinc-900 border border-gray-200 dark:border-zinc-800 text-gray-900 dark:text-zinc-100 text-sm rounded-xl focus:ring-2 focus:ring-blue-500/50 focus:border-blue-500 block w-full px-3 sm:px-4 py-2 resize-none shadow-sm transition-all placeholder:text-gray-400 dark:placeholder:text-zinc-500 min-h-[40px] max-h-[200px] overflow-y-auto"
Te6edf3rowsTff7b72=Ta5d6ff"1"
Te6edf3spellcheckTff7b72=Ta5d6ff"true"
Tb4b4b4:Te6edf3placeholderTff7b72=Ta5d6ff"Te6edf3$tTb4b4b4(Ta5d6ff'messages.send_placeholder'Tb4b4b4)Ta5d6ff"
Tb4b4b4@Te6edf3keydownTb4b4b4.Te6edf3enterTb4b4b4.Te6edf3exactTb4b4b4.Te6edf3preventTff7b72=Ta5d6ff"Te6edf3onEnterPressedTa5d6ff"
Tb4b4b4@Te6edf3keydownTb4b4b4.Te6edf3enterTb4b4b4.Te6edf3shiftTb4b4b4.Te6edf3exactTb4b4b4.Te6edf3preventTff7b72=Ta5d6ff"Te6edf3onShiftEnterPressedTa5d6ff"
Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72textareaTb4b4b4>
T8b949e<!-- reply preview -->
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3replyingToTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"mt-2 p-2 rounded-xl bg-gray-50 dark:bg-zinc-800/50 border border-gray-200 dark:border-zinc-700/50 flex items-center gap-3 animate-in fade-in slide-in-from-bottom-2 duration-200"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex-1 min-w-0 border-l-2 border-blue-500 pl-3"Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-1 text-[10px] font-bold text-blue-500 uppercase tracking-wider mb-0.5"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"reply" Te6edf3classTff7b72=Ta5d6ff"size-3" Tb4b4b4/Tb4b4b4>
Tff7b72{{ Te6edf3$tTb4b4b4(Ta5d6ff"messages.replying_to"Tb4b4b4) Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-xs text-gray-600 dark:text-zinc-400 truncate italic"Tb4b4b4>
Tff7b72{{ Te6edf3replyingToTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3content Tff7b72|| Ta5d6ff"(Attachment)" Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"p-1.5 hover:bg-gray-200 dark:hover:bg-zinc-700 rounded-lg transition-colors text-gray-400 hover:text-gray-600 dark:hover:text-zinc-200"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3cancelReplyTa5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"close" Te6edf3classTff7b72=Ta5d6ff"w-4 h-4" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- action button -->
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex flex-wrap gap-2 items-center mt-2"Tb4b4b4>
Tb4b4b4<Tff7b72button Te6edf3typeTff7b72=Ta5d6ff"button" Te6edf3classTff7b72=Ta5d6ff"attachment-action-button" Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3addFilesToMessageTa5d6ff"Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"paperclip-plus" Te6edf3classTff7b72=Ta5d6ff"w-4 h-4" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"hidden sm:inline"Tb4b4b4>Tff7b72{{ Te6edf3$tTb4b4b4(Ta5d6ff"messages.add_files"Tb4b4b4) Tff7b72}}Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"attachment-action-button"
Tb4b4b4:Te6edf3titleTff7b72=Ta5d6ff"Te6edf3$tTb4b4b4(Ta5d6ff'messages.paste_from_clipboard'Tb4b4b4)Ta5d6ff"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3pasteFromClipboardTa5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"content-paste" Te6edf3classTff7b72=Ta5d6ff"w-4 h-4" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"hidden sm:inline"Tb4b4b4>PasteTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72AddImageButton Tb4b4b4@Te6edf3add-imageTff7b72=Ta5d6ff"Te6edf3onImageSelectedTa5d6ff" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72AddAudioButton
Tb4b4b4:Te6edf3is-recording-audio-attachmentTff7b72=Ta5d6ff"Te6edf3isRecordingAudioAttachmentTa5d6ff"
Tb4b4b4@Te6edf3start-recordingTff7b72=Ta5d6ff"Te6edf3startRecordingAudioAttachmentTb4b4b4(Te6edf3$eventTb4b4b4)Ta5d6ff"
Tb4b4b4@Te6edf3stop-recordingTff7b72=Ta5d6ff"Te6edf3stopRecordingAudioAttachmentTa5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72spanTb4b4b4>Tff7b72{{ Te6edf3$tTb4b4b4(Ta5d6ff"messages.recording"Tb4b4b4, Tb4b4b4{ Te6edf3durationTff7b72: Te6edf3audioAttachmentRecordingDuration Tb4b4b4}Tb4b4b4) Tff7b72}}Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72AddAudioButtonTb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"attachment-action-button"
Tb4b4b4:Te6edf3titleTff7b72=Ta5d6ff"Te6edf3$tTb4b4b4(Ta5d6ff'messages.share_location'Tb4b4b4)Ta5d6ff"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3shareLocationTa5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"map-marker" Te6edf3classTff7b72=Ta5d6ff"w-4 h-4" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"hidden sm:inline"Tb4b4b4>Tff7b72{{ Te6edf3$tTb4b4b4(Ta5d6ff"messages.location"Tb4b4b4) Tff7b72}}Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"attachment-action-button"
Tb4b4b4:Te6edf3titleTff7b72=Ta5d6ff"Te6edf3$tTb4b4b4(Ta5d6ff'messages.request_location'Tb4b4b4)Ta5d6ff"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3requestLocationTa5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"crosshairs-question" Te6edf3classTff7b72=Ta5d6ff"w-4 h-4" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"hidden sm:inline"Tb4b4b4>Tff7b72{{ Te6edf3$tTb4b4b4(Ta5d6ff"messages.request"Tb4b4b4) Tff7b72}}Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"attachment-action-button"
Tb4b4b4:Te6edf3titleTff7b72=Ta5d6ff"Te6edf3$tTb4b4b4(Ta5d6ff'messages.generate_paper_message'Tb4b4b4)Ta5d6ff"
Tb4b4b4:Te6edf3disabledTff7b72=Ta5d6ff"Tff7b72!Te6edf3canSendMessage Tff7b72|| Te6edf3isGeneratingPaperMessageTa5d6ff"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3generatePaperMessageFromCompositionTa5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72template Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3isGeneratingPaperMessageTa5d6ff"Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"size-4 border-2 border-blue-500/20 border-t-blue-500 rounded-full animate-spin"
Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"hidden sm:inline"Tb4b4b4>Generating...Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72templateTb4b4b4>
Tb4b4b4<Tff7b72template Te6edf3v-elseTb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"qrcode-plus" Te6edf3classTff7b72=Ta5d6ff"w-4 h-4" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"hidden sm:inline"Tb4b4b4>LXMTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72templateTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3hasTranslator Tff7b72&& Te6edf3newMessageTextTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"attachment-action-button"
Tb4b4b4:Te6edf3titleTff7b72=Ta5d6ff"Te6edf3$tTb4b4b4(Ta5d6ff'translator.translate'Tb4b4b4)Ta5d6ff"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3translateMessageTa5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"translate" Te6edf3classTff7b72=Ta5d6ff"w-4 h-4" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"hidden sm:inline"Tb4b4b4>Tff7b72{{ Te6edf3$tTb4b4b4(Ta5d6ff"translator.translate"Tb4b4b4) Tff7b72}}Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"ml-auto my-auto"Tb4b4b4>
Tb4b4b4<Tff7b72SendMessageButton
Tb4b4b4:Te6edf3is-sending-messageTff7b72=Ta5d6ff"Te6edf3isSendingMessageTa5d6ff"
Tb4b4b4:Te6edf3can-send-messageTff7b72=Ta5d6ff"Te6edf3canSendMessageTa5d6ff"
Tb4b4b4:Te6edf3delivery-methodTff7b72=Ta5d6ff"Te6edf3newMessageDeliveryMethodTa5d6ff"
Tb4b4b4@Te6edf3sendTff7b72=Ta5d6ff"Te6edf3sendMessageTa5d6ff"
Tb4b4b4@Te6edf3delivery-method-changedTff7b72=Ta5d6ff"Te6edf3newMessageDeliveryMethod Tff7b72= Te6edf3$eventTa5d6ff"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- hidden file input for selecting files -->
Tb4b4b4<Tff7b72input Te6edf3refTff7b72=Ta5d6ff"file-input" Te6edf3typeTff7b72=Ta5d6ff"file" Te6edf3multiple Te6edf3styleTff7b72=Ta5d6ff"display: none" Tb4b4b4@Te6edf3changeTff7b72=Ta5d6ff"Te6edf3onFileInputChangeTa5d6ff" Tb4b4b4/Tb4b4b4>
T8b949e<!-- Message Context Menu -->
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3messageContextMenuTb4b4b4.Te6edf3showTa5d6ff"
Te6edf3v-click-outsideTff7b72=Ta5d6ff"Tb4b4b4{ Te6edf3handlerTff7b72: Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4(Te6edf3messageContextMenuTb4b4b4.Te6edf3show Tff7b72= Tff7b72falseTb4b4b4)Tb4b4b4, Te6edf3captureTff7b72: Tff7b72true Tb4b4b4}Ta5d6ff"
Te6edf3classTff7b72=Ta5d6ff"fixed z-[100] min-w-[180px] bg-white dark:bg-zinc-800 rounded-2xl shadow-2xl border border-gray-200 dark:border-zinc-700 py-1.5 overflow-hidden animate-in fade-in zoom-in duration-100"
Tb4b4b4:Te6edf3styleTff7b72=Ta5d6ff"Tb4b4b4{ Te6edf3topTff7b72: Te6edf3messageContextMenuTb4b4b4.Te6edf3y Tff7b72+ Ta5d6ff'px'Tb4b4b4, Te6edf3leftTff7b72: Te6edf3messageContextMenuTb4b4b4.Te6edf3x Tff7b72+ Ta5d6ff'px' Tb4b4b4}Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"w-full flex items-center gap-3 px-4 py-2.5 text-sm text-gray-700 dark:text-zinc-300 hover:bg-gray-100 dark:hover:bg-zinc-700 transition-all active:scale-95"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3replyToMessageTb4b4b4(Te6edf3messageContextMenuTb4b4b4.Te6edf3chatItemTb4b4b4)Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"reply" Te6edf3classTff7b72=Ta5d6ff"size-4 text-indigo-500" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"font-medium"Tb4b4b4>ReplyTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"w-full flex items-center gap-3 px-4 py-2.5 text-sm text-gray-700 dark:text-zinc-300 hover:bg-gray-100 dark:hover:bg-zinc-700 transition-all active:scale-95"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"
Te6edf3showRawMessageTb4b4b4(Te6edf3messageContextMenuTb4b4b4.Te6edf3chatItemTb4b4b4)Tb4b4b4;
Te6edf3messageContextMenuTb4b4b4.Te6edf3show Tff7b72= Tff7b72falseTb4b4b4;
Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"code-json" Te6edf3classTff7b72=Ta5d6ff"size-4 text-gray-400" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"font-medium"Tb4b4b4>View Raw LXMTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"border-t border-gray-100 dark:border-zinc-700 my-1.5 mx-2"Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"w-full flex items-center gap-3 px-4 py-2.5 text-sm text-rose-600 dark:text-rose-400 hover:bg-rose-50 dark:hover:bg-rose-900/20 transition-all active:scale-95"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"
Te6edf3deleteChatItemTb4b4b4(Te6edf3messageContextMenuTb4b4b4.Te6edf3chatItemTb4b4b4)Tb4b4b4;
Te6edf3messageContextMenuTb4b4b4.Te6edf3show Tff7b72= Tff7b72falseTb4b4b4;
Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"trash-can-outline" Te6edf3classTff7b72=Ta5d6ff"size-4" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"font-medium"Tb4b4b4>DeleteTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- no peer selected -->
Tb4b4b4<Tff7b72div Te6edf3v-else Te6edf3classTff7b72=Ta5d6ff"flex flex-col h-full overflow-y-auto bg-gray-50/50 dark:bg-zinc-950/50"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"max-w-4xl mx-auto w-full px-4 py-8 sm:py-12 flex flex-col items-center"Tb4b4b4>
T8b949e<!-- welcome header -->
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-center mb-12"Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"inline-flex items-center justify-center p-4 rounded-3xl bg-indigo-600 shadow-xl shadow-indigo-500/20 mb-6"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"message-text" Te6edf3classTff7b72=Ta5d6ff"size-10 text-white" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72h1 Te6edf3classTff7b72=Ta5d6ff"text-3xl font-black text-gray-900 dark:text-white tracking-tight mb-3"Tb4b4b4>
Tff7b72{{ Te6edf3$tTb4b4b4(Ta5d6ff"messages.no_active_chat"Tb4b4b4) Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72h1Tb4b4b4>
Tb4b4b4<Tff7b72p Te6edf3classTff7b72=Ta5d6ff"text-gray-500 dark:text-zinc-400 max-w-sm mx-auto"Tb4b4b4>
Tff7b72{{ Te6edf3$tTb4b4b4(Ta5d6ff"messages.select_peer_or_enter_address"Tb4b4b4) Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- main actions grid -->
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"grid grid-cols-2 sm:grid-cols-4 gap-4 w-full mb-12"Tb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"flex flex-col items-center gap-3 p-6 rounded-3xl bg-white dark:bg-zinc-900 border border-gray-100 dark:border-zinc-800 hover:border-indigo-500/50 hover:shadow-xl hover:shadow-indigo-500/5 transition-all group"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3focusComposeInputTa5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"size-12 rounded-2xl bg-indigo-50 dark:bg-indigo-900/20 text-indigo-600 flex items-center justify-center group-hover:scale-110 transition-transform"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"plus" Te6edf3classTff7b72=Ta5d6ff"size-6" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-sm font-bold text-gray-900 dark:text-zinc-100"Tb4b4b4>New MessageTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"flex flex-col items-center gap-3 p-6 rounded-3xl bg-white dark:bg-zinc-900 border border-gray-100 dark:border-zinc-800 hover:border-blue-500/50 hover:shadow-xl hover:shadow-blue-500/5 transition-all group"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3syncPropagationNodeTa5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"size-12 rounded-2xl bg-indigo-50 dark:bg-indigo-900/20 text-indigo-600 flex items-center justify-center group-hover:scale-110 transition-transform"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon
Te6edf3icon-nameTff7b72=Ta5d6ff"sync"
Te6edf3classTff7b72=Ta5d6ff"size-6"
Tb4b4b4:Te6edf3classTff7b72=Ta5d6ff"Tb4b4b4{ Ta5d6ff'animate-spin'Tff7b72: Te6edf3isSyncingPropagationNode Tb4b4b4}Ta5d6ff"
Tb4b4b4:Te6edf3styleTff7b72=Ta5d6ff"Te6edf3isSyncingPropagationNode Tff7b72? Tb4b4b4{ Te6edf3animationDirectionTff7b72: Ta5d6ff'reverse' Tb4b4b4} Tff7b72: Tb4b4b4{Tb4b4b4}Ta5d6ff"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-sm font-bold text-gray-900 dark:text-zinc-100"Tb4b4b4>Tff7b72{{
Te6edf3isSyncingPropagationNode Tff7b72? Ta5d6ff"Syncing..." Tff7b72: Ta5d6ff"Sync Node"
Tff7b72}}Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"flex flex-col items-center gap-3 p-6 rounded-3xl bg-white dark:bg-zinc-900 border border-gray-100 dark:border-zinc-800 hover:border-blue-500/50 hover:shadow-xl hover:shadow-blue-500/5 transition-all group"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3copyMyAddressTa5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"size-12 rounded-2xl bg-emerald-50 dark:bg-emerald-900/20 text-emerald-600 flex items-center justify-center group-hover:scale-110 transition-transform"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"content-copy" Te6edf3classTff7b72=Ta5d6ff"size-6" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-sm font-bold text-gray-900 dark:text-zinc-100"Tb4b4b4>My AddressTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"flex flex-col items-center gap-3 p-6 rounded-3xl bg-white dark:bg-zinc-900 border border-gray-100 dark:border-zinc-800 hover:border-blue-500/50 hover:shadow-xl hover:shadow-blue-500/5 transition-all group"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3$routerTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4{ Te6edf3nameTff7b72: Ta5d6ff'identities' Tb4b4b4}Tb4b4b4)Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"size-12 rounded-2xl bg-purple-50 dark:bg-purple-900/20 text-purple-600 flex items-center justify-center group-hover:scale-110 transition-transform"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"account-multiple" Te6edf3classTff7b72=Ta5d6ff"size-6" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-sm font-bold text-gray-900 dark:text-zinc-100"Tb4b4b4>IdentitiesTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- latest chats section -->
Tb4b4b4<Tff7b72div Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3latestConversationsTb4b4b4.Te6edf3length Tff7b72> T79c0ff0Ta5d6ff" Te6edf3classTff7b72=Ta5d6ff"w-full mb-12"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex items-center justify-between mb-6"Tb4b4b4>
Tb4b4b4<Tff7b72h2
Te6edf3classTff7b72=Ta5d6ff"text-sm font-black text-gray-400 dark:text-zinc-500 uppercase tracking-widest flex items-center gap-2"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"history" Te6edf3classTff7b72=Ta5d6ff"size-4" Tb4b4b4/Tb4b4b4>
Latest Conversations
Tb4b4b4<Tb4b4b4/Tff7b72h2Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"grid grid-cols-1 sm:grid-cols-2 gap-4"Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3v-forTff7b72=Ta5d6ff"Te6edf3chat Tff7b72in Te6edf3latestConversationsTa5d6ff"
Tb4b4b4:Te6edf3keyTff7b72=Ta5d6ff"Te6edf3chatTb4b4b4.Te6edf3destination_hashTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"group cursor-pointer p-4 bg-white dark:bg-zinc-900 border border-gray-100 dark:border-zinc-800 rounded-3xl hover:border-blue-500/50 hover:shadow-xl transition-all flex items-center gap-4"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3$emitTb4b4b4(Ta5d6ff'update:selectedPeer'Tb4b4b4, Te6edf3chatTb4b4b4)Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex-shrink-0"Tb4b4b4>
Tb4b4b4<Tff7b72LxmfUserIcon
Tb4b4b4:Te6edf3custom-imageTff7b72=Ta5d6ff"Te6edf3chatTb4b4b4.Te6edf3contact_imageTa5d6ff"
Tb4b4b4:Te6edf3icon-nameTff7b72=Ta5d6ff"
Te6edf3chatTb4b4b4.Te6edf3lxmf_user_icon Tff7b72&& Te6edf3chatTb4b4b4.Te6edf3lxmf_user_iconTb4b4b4.Te6edf3icon_name
Tff7b72? Te6edf3chatTb4b4b4.Te6edf3lxmf_user_iconTb4b4b4.Te6edf3icon_name
Tff7b72: Ta5d6ff'account'
Ta5d6ff"
Tb4b4b4:Te6edf3icon-foreground-colourTff7b72=Ta5d6ff"
Te6edf3chatTb4b4b4.Te6edf3lxmf_user_icon Tff7b72? Te6edf3chatTb4b4b4.Te6edf3lxmf_user_iconTb4b4b4.Te6edf3foreground_colour Tff7b72: Ta5d6ff''
Ta5d6ff"
Tb4b4b4:Te6edf3icon-background-colourTff7b72=Ta5d6ff"
Te6edf3chatTb4b4b4.Te6edf3lxmf_user_icon Tff7b72? Te6edf3chatTb4b4b4.Te6edf3lxmf_user_iconTb4b4b4.Te6edf3background_colour Tff7b72: Ta5d6ff''
Ta5d6ff"
Te6edf3icon-classTff7b72=Ta5d6ff"size-12 sm:size-14"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex-1 min-w-0"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex items-center justify-between gap-2"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"font-bold text-gray-900 dark:text-zinc-100 truncate"Tb4b4b4>
Tff7b72{{ Te6edf3chatTb4b4b4.Te6edf3custom_display_name Tff7b72?? Te6edf3chatTb4b4b4.Te6edf3display_name Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-[10px] text-gray-400 dark:text-zinc-500 whitespace-nowrap"Tb4b4b4>
Tff7b72{{ Te6edf3formatTimeAgoTb4b4b4(Te6edf3chatTb4b4b4.Te6edf3updated_atTb4b4b4) Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-xs text-gray-500 dark:text-zinc-500 truncate mt-0.5"Tb4b4b4>
Tff7b72{{ Te6edf3chatTb4b4b4.Te6edf3latest_message_preview Tff7b72|| Te6edf3chatTb4b4b4.Te6edf3latest_message_title Tff7b72|| Ta5d6ff"No messages yet" Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon
Te6edf3icon-nameTff7b72=Ta5d6ff"chevron-right"
Te6edf3classTff7b72=Ta5d6ff"size-5 text-gray-300 dark:text-zinc-700 group-hover:text-blue-500 transition-colors"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- address input composer -->
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"w-full max-w-xl"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"relative group"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none"Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon
Te6edf3icon-nameTff7b72=Ta5d6ff"at"
Te6edf3classTff7b72=Ta5d6ff"size-5 text-gray-400 group-focus-within:text-blue-500 transition-colors"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3idTff7b72=Ta5d6ff"compose-input"
Te6edf3refTff7b72=Ta5d6ff"compose-input"
Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3composeAddressTa5d6ff"
Tb4b4b4:Te6edf3readonlyTff7b72=Ta5d6ff"Te6edf3isSendingMessageTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"text"
Te6edf3classTff7b72=Ta5d6ff"w-full bg-white dark:bg-zinc-900 border-2 border-gray-100 dark:border-zinc-800 text-gray-900 dark:text-zinc-100 text-base rounded-3xl focus:ring-4 focus:ring-blue-500/10 focus:border-blue-500 pl-12 pr-4 py-4 shadow-sm transition-all placeholder:text-gray-400 dark:placeholder:text-zinc-600 font-medium"
Te6edf3placeholderTff7b72=Ta5d6ff"Enter LXMF address to start a conversation..."
Tb4b4b4@Te6edf3keydownTb4b4b4.Te6edf3enterTb4b4b4.Te6edf3exactTb4b4b4.Te6edf3preventTff7b72=Ta5d6ff"Te6edf3onComposeEnterPressedTa5d6ff"
Tb4b4b4@Te6edf3keydownTb4b4b4.Te6edf3upTb4b4b4.Te6edf3preventTff7b72=Ta5d6ff"Te6edf3handleComposeInputUpTa5d6ff"
Tb4b4b4@Te6edf3keydownTb4b4b4.Te6edf3downTb4b4b4.Te6edf3preventTff7b72=Ta5d6ff"Te6edf3handleComposeInputDownTa5d6ff"
Tb4b4b4@Te6edf3focusTff7b72=Ta5d6ff"Te6edf3isComposeInputFocused Tff7b72= Tff7b72trueTa5d6ff"
Tb4b4b4@Te6edf3blurTff7b72=Ta5d6ff"Te6edf3onComposeInputBlurTa5d6ff"
Tb4b4b4/Tb4b4b4>
T8b949e<!-- Suggestions Dropdown -->
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3isComposeInputFocused Tff7b72&& Te6edf3composeSuggestionsTb4b4b4.Te6edf3length Tff7b72> T79c0ff0Ta5d6ff"
Te6edf3classTff7b72=Ta5d6ff"absolute z-50 left-0 right-0 bottom-full mb-4 bg-white dark:bg-zinc-900 border border-gray-100 dark:border-zinc-800 rounded-3xl shadow-2xl overflow-hidden animate-in fade-in slide-in-from-bottom-4 duration-300"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"p-2 space-y-1"Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3v-forTff7b72=Ta5d6ff"Tb4b4b4(Te6edf3suggestionTb4b4b4, Te6edf3indexTb4b4b4) Tff7b72in Te6edf3composeSuggestionsTa5d6ff"
Tb4b4b4:Te6edf3keyTff7b72=Ta5d6ff"Te6edf3suggestionTb4b4b4.Te6edf3hashTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"px-4 py-3 flex items-center gap-3 cursor-pointer rounded-2xl transition-all"
Tb4b4b4:Te6edf3classTff7b72=Ta5d6ff"Tb4b4b4[
Te6edf3index Tff7b72=== Te6edf3selectedComposeSuggestionIndex
Tff7b72? Ta5d6ff'bg-blue-600 text-white shadow-lg'
Tff7b72: Ta5d6ff'hover:bg-gray-50 dark:hover:bg-zinc-800/50 text-gray-700 dark:text-zinc-300'Tb4b4b4,
Tb4b4b4]Ta5d6ff"
Tb4b4b4@Te6edf3mousedownTb4b4b4.Te6edf3preventTff7b72=Ta5d6ff"Te6edf3selectComposeSuggestionTb4b4b4(Te6edf3suggestionTb4b4b4)Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"shrink-0 size-10 rounded-xl flex items-center justify-center"
Tb4b4b4:Te6edf3classTff7b72=Ta5d6ff"Tb4b4b4[
Te6edf3index Tff7b72=== Te6edf3selectedComposeSuggestionIndex
Tff7b72? Ta5d6ff'bg-white/20'
Tff7b72: Te6edf3suggestionTb4b4b4.Te6edf3type Tff7b72=== Ta5d6ff'contact'
Tff7b72? Ta5d6ff'bg-blue-100 dark:bg-blue-900/40 text-blue-600'
Tff7b72: Ta5d6ff'bg-gray-100 dark:bg-zinc-800 text-gray-500'Tb4b4b4,
Tb4b4b4]Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Tb4b4b4:Te6edf3icon-nameTff7b72=Ta5d6ff"Te6edf3suggestionTb4b4b4.Te6edf3iconTa5d6ff" Te6edf3classTff7b72=Ta5d6ff"size-5" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex-1 min-w-0"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-sm font-bold truncate"Tb4b4b4>
Tff7b72{{ Te6edf3suggestionTb4b4b4.Te6edf3name Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-[10px] font-mono opacity-60 truncate"Tb4b4b4>
Tff7b72{{ Te6edf3formatDestinationHashTb4b4b4(Te6edf3suggestionTb4b4b4.Te6edf3hashTb4b4b4) Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3suggestionTb4b4b4.Te6edf3type Tff7b72=== Ta5d6ff'contact'Ta5d6ff"
Te6edf3classTff7b72=Ta5d6ff"text-[10px] uppercase font-black tracking-widest opacity-40 px-2 py-1 rounded-md bg-black/5"
Tb4b4b4>
Contact
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- image modal -->
Tb4b4b4<Tff7b72Transition
Te6edf3enter-active-classTff7b72=Ta5d6ff"transition ease-out duration-200"
Te6edf3enter-from-classTff7b72=Ta5d6ff"opacity-0"
Te6edf3enter-to-classTff7b72=Ta5d6ff"opacity-100"
Te6edf3leave-active-classTff7b72=Ta5d6ff"transition ease-in duration-150"
Te6edf3leave-from-classTff7b72=Ta5d6ff"opacity-100"
Te6edf3leave-to-classTff7b72=Ta5d6ff"opacity-0"
Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3imageModalUrlTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"fixed inset-0 z-50 flex items-center justify-center bg-black/80 dark:bg-black/90 backdrop-blur-sm p-4"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3closeImageModalTa5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"relative max-w-7xl max-h-full" @Te6edf3click.Te6edf3stopTb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"absolute -top-12 right-0 inline-flex items-center justify-center w-10 h-10 rounded-xl bg-white/10 dark:bg-zinc-900/10 hover:bg-white/20 dark:hover:bg-zinc-900/20 text-white transition-colors"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3closeImageModalTa5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"close" Te6edf3classTff7b72=Ta5d6ff"size-5" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72img Tb4b4b4:Te6edf3srcTff7b72=Ta5d6ff"Te6edf3imageModalUrlTa5d6ff" Te6edf3classTff7b72=Ta5d6ff"max-w-full max-h-[90vh] rounded-xl shadow-2xl" Te6edf3altTff7b72=Ta5d6ff"Image preview" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72TransitionTb4b4b4>
Tb4b4b4<Tff7b72PaperMessageModal
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3isPaperMessageModalOpenTa5d6ff"
Tb4b4b4:Te6edf3message-hashTff7b72=Ta5d6ff"Te6edf3paperMessageHashTa5d6ff"
Tb4b4b4:Te6edf3recipient-hashTff7b72=Ta5d6ff"Te6edf3selectedPeerTff7b72?Tb4b4b4.Te6edf3destination_hashTa5d6ff"
Tb4b4b4@Te6edf3closeTff7b72=Ta5d6ff"Te6edf3isPaperMessageModalOpen Tff7b72= Tff7b72falseTa5d6ff"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72PaperMessageModal
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3isPaperMessageResultModalOpenTa5d6ff"
Tb4b4b4:Te6edf3initial-uriTff7b72=Ta5d6ff"Te6edf3generatedPaperMessageUriTa5d6ff"
Tb4b4b4:Te6edf3recipient-hashTff7b72=Ta5d6ff"Te6edf3selectedPeerTff7b72?Tb4b4b4.Te6edf3destination_hashTa5d6ff"
Tb4b4b4@Te6edf3closeTff7b72=Ta5d6ff"
Te6edf3isPaperMessageResultModalOpen Tff7b72= Tff7b72falseTb4b4b4;
Te6edf3generatedPaperMessageUri Tff7b72= Tff7b72nullTb4b4b4;
Ta5d6ff"
Tb4b4b4/Tb4b4b4>
T8b949e<!-- Raw Message Modal -->
Tb4b4b4<Tff7b72Transition
Te6edf3enter-active-classTff7b72=Ta5d6ff"transition ease-out duration-200"
Te6edf3enter-from-classTff7b72=Ta5d6ff"opacity-0 scale-95"
Te6edf3enter-to-classTff7b72=Ta5d6ff"opacity-100 scale-100"
Te6edf3leave-active-classTff7b72=Ta5d6ff"transition ease-in duration-150"
Te6edf3leave-from-classTff7b72=Ta5d6ff"opacity-100 scale-100"
Te6edf3leave-to-classTff7b72=Ta5d6ff"opacity-0 scale-95"
Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3isRawMessageModalOpenTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"fixed inset-0 z-[150] flex items-center justify-center p-4 bg-black/60 backdrop-blur-sm"
Tb4b4b4@Te6edf3clickTb4b4b4.Te6edf3selfTff7b72=Ta5d6ff"Te6edf3isRawMessageModalOpen Tff7b72= Tff7b72falseTa5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"w-full max-w-2xl bg-white dark:bg-zinc-900 rounded-2xl shadow-2xl overflow-hidden flex flex-col max-h-[90vh]"
Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"px-6 py-4 border-b border-gray-100 dark:border-zinc-800 flex items-center justify-between shrink-0"
Tb4b4b4>
Tb4b4b4<Tff7b72h3 Te6edf3classTff7b72=Ta5d6ff"text-lg font-bold text-gray-900 dark:text-white"Tb4b4b4>Raw LXMF MessageTb4b4b4<Tb4b4b4/Tff7b72h3Tb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"text-gray-400 hover:text-gray-500 dark:hover:text-zinc-300 transition-colors"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3isRawMessageModalOpen Tff7b72= Tff7b72falseTa5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"close" Te6edf3classTff7b72=Ta5d6ff"size-6" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"p-0 overflow-y-auto bg-gray-50 dark:bg-zinc-950 flex-grow"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"p-6 space-y-6"Tb4b4b4>
T8b949e<!-- header / status info -->
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"grid grid-cols-1 md:grid-cols-2 gap-4"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"space-y-1"Tb4b4b4>
Tb4b4b4<Tff7b72label
Te6edf3classTff7b72=Ta5d6ff"text-[10px] font-bold uppercase tracking-wider text-gray-400 dark:text-zinc-500"
Tb4b4b4>Message IDTb4b4b4<Tb4b4b4/Tff7b72label
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-sm font-mono text-gray-900 dark:text-zinc-200"Tb4b4b4>
Tff7b72{{ Te6edf3rawMessageDataTb4b4b4.Te6edf3id Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"space-y-1"Tb4b4b4>
Tb4b4b4<Tff7b72label
Te6edf3classTff7b72=Ta5d6ff"text-[10px] font-bold uppercase tracking-wider text-gray-400 dark:text-zinc-500"
Tb4b4b4>StateTb4b4b4<Tb4b4b4/Tff7b72label
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2"Tb4b4b4>
Tb4b4b4<Tff7b72span
Te6edf3classTff7b72=Ta5d6ff"inline-flex items-center rounded-md px-2 py-1 text-xs font-medium ring-1 ring-inset"
Tb4b4b4:Te6edf3classTff7b72=Ta5d6ff"
Te6edf3rawMessageDataTb4b4b4.Te6edf3state Tff7b72=== Ta5d6ff'delivered'
Tff7b72? Ta5d6ff'bg-green-50 text-green-700 ring-green-600/20 dark:bg-green-900/30 dark:text-green-400'
Tff7b72: Ta5d6ff'bg-blue-50 text-blue-700 ring-blue-700/10 dark:bg-blue-900/30 dark:text-blue-400'
Ta5d6ff"
Tb4b4b4>
Tff7b72{{ Te6edf3rawMessageDataTb4b4b4.Te6edf3state Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3rawMessageDataTb4b4b4.Te6edf3is_incomingTa5d6ff" Te6edf3classTff7b72=Ta5d6ff"text-[10px] text-gray-400"
Tb4b4b4>IncomingTb4b4b4<Tb4b4b4/Tff7b72span
Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3v-else Te6edf3classTff7b72=Ta5d6ff"text-[10px] text-gray-400"Tb4b4b4>OutboundTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"space-y-1"Tb4b4b4>
Tb4b4b4<Tff7b72label
Te6edf3classTff7b72=Ta5d6ff"text-[10px] font-bold uppercase tracking-wider text-gray-400 dark:text-zinc-500"
Tb4b4b4>Message HashTb4b4b4<Tb4b4b4/Tff7b72label
Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"text-sm font-mono break-all text-gray-900 dark:text-zinc-200 bg-white dark:bg-zinc-900 p-2 rounded border border-gray-100 dark:border-zinc-800"
Tb4b4b4>
Tff7b72{{ Te6edf3rawMessageDataTb4b4b4.Te6edf3hash Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"grid grid-cols-1 md:grid-cols-2 gap-4"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"space-y-1"Tb4b4b4>
Tb4b4b4<Tff7b72label
Te6edf3classTff7b72=Ta5d6ff"text-[10px] font-bold uppercase tracking-wider text-gray-400 dark:text-zinc-500"
Tb4b4b4>Source HashTb4b4b4<Tb4b4b4/Tff7b72label
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-xs font-mono break-all text-gray-900 dark:text-zinc-200"Tb4b4b4>
Tff7b72{{ Te6edf3rawMessageDataTb4b4b4.Te6edf3source_hash Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"space-y-1"Tb4b4b4>
Tb4b4b4<Tff7b72label
Te6edf3classTff7b72=Ta5d6ff"text-[10px] font-bold uppercase tracking-wider text-gray-400 dark:text-zinc-500"
Tb4b4b4>Destination HashTb4b4b4<Tb4b4b4/Tff7b72label
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-xs font-mono break-all text-gray-900 dark:text-zinc-200"Tb4b4b4>
Tff7b72{{ Te6edf3rawMessageDataTb4b4b4.Te6edf3destination_hash Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"grid grid-cols-2 md:grid-cols-4 gap-4"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"space-y-1"Tb4b4b4>
Tb4b4b4<Tff7b72label
Te6edf3classTff7b72=Ta5d6ff"text-[10px] font-bold uppercase tracking-wider text-gray-400 dark:text-zinc-500"
Tb4b4b4>MethodTb4b4b4<Tb4b4b4/Tff7b72label
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-sm text-gray-900 dark:text-zinc-200 capitalize"Tb4b4b4>
Tff7b72{{ Te6edf3rawMessageDataTb4b4b4.Te6edf3method Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"space-y-1"Tb4b4b4>
Tb4b4b4<Tff7b72label
Te6edf3classTff7b72=Ta5d6ff"text-[10px] font-bold uppercase tracking-wider text-gray-400 dark:text-zinc-500"
Tb4b4b4>RSSITb4b4b4<Tb4b4b4/Tff7b72label
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-sm text-gray-900 dark:text-zinc-200"Tb4b4b4>
Tff7b72{{ Te6edf3rawMessageDataTb4b4b4.Te6edf3rssi Tff7b72|| Ta5d6ff"N/A" Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"space-y-1"Tb4b4b4>
Tb4b4b4<Tff7b72label
Te6edf3classTff7b72=Ta5d6ff"text-[10px] font-bold uppercase tracking-wider text-gray-400 dark:text-zinc-500"
Tb4b4b4>SNRTb4b4b4<Tb4b4b4/Tff7b72label
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-sm text-gray-900 dark:text-zinc-200"Tb4b4b4>
Tff7b72{{ Te6edf3rawMessageDataTb4b4b4.Te6edf3snr Tff7b72|| Ta5d6ff"N/A" Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"space-y-1"Tb4b4b4>
Tb4b4b4<Tff7b72label
Te6edf3classTff7b72=Ta5d6ff"text-[10px] font-bold uppercase tracking-wider text-gray-400 dark:text-zinc-500"
Tb4b4b4>AttemptsTb4b4b4<Tb4b4b4/Tff7b72label
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-sm text-gray-900 dark:text-zinc-200"Tb4b4b4>
Tff7b72{{ Te6edf3rawMessageDataTb4b4b4.Te6edf3delivery_attempts Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"space-y-1"Tb4b4b4>
Tb4b4b4<Tff7b72label
Te6edf3classTff7b72=Ta5d6ff"text-[10px] font-bold uppercase tracking-wider text-gray-400 dark:text-zinc-500"
Tb4b4b4>Content / App DataTb4b4b4<Tb4b4b4/Tff7b72label
Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"text-xs font-mono bg-white dark:bg-zinc-900 p-3 rounded border border-gray-100 dark:border-zinc-800 whitespace-pre-wrap break-all text-gray-800 dark:text-zinc-300"
Tb4b4b4>
Tff7b72{{ Te6edf3rawMessageDataTb4b4b4.Te6edf3content Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3rawMessageDataTb4b4b4.Te6edf3raw_uriTa5d6ff" Te6edf3classTff7b72=Ta5d6ff"space-y-1"Tb4b4b4>
Tb4b4b4<Tff7b72label
Te6edf3classTff7b72=Ta5d6ff"text-[10px] font-bold uppercase tracking-wider text-gray-400 dark:text-zinc-500"
Tb4b4b4>Raw LXMF URITb4b4b4<Tb4b4b4/Tff7b72label
Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"text-[10px] font-mono bg-white dark:bg-zinc-900 p-2 rounded border border-gray-100 dark:border-zinc-800 break-all text-gray-600 dark:text-zinc-400"
Tb4b4b4>
Tff7b72{{ Te6edf3rawMessageDataTb4b4b4.Te6edf3raw_uri Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- JSON fallback for full detail -->
Tb4b4b4<Tff7b72details Te6edf3classTff7b72=Ta5d6ff"group"Tb4b4b4>
Tb4b4b4<Tff7b72summary
Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2 cursor-pointer text-[10px] font-bold uppercase tracking-wider text-gray-400 dark:text-zinc-500 hover:text-gray-600 dark:hover:text-zinc-300 transition-colors"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon
Te6edf3icon-nameTff7b72=Ta5d6ff"chevron-right"
Te6edf3classTff7b72=Ta5d6ff"size-4 group-open:rotate-90 transition-transform"
Tb4b4b4/Tb4b4b4>
View Full JSON Object
Tb4b4b4<Tb4b4b4/Tff7b72summaryTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"mt-2 p-4 bg-black/5 dark:bg-black/20 rounded-lg overflow-x-auto"Tb4b4b4>
Tb4b4b4<Tff7b72pre Te6edf3classTff7b72=Ta5d6ff"text-[10px] font-mono text-gray-600 dark:text-zinc-400"Tb4b4b4>Tff7b72{{
Tffa657JSONTb4b4b4.Te6edf3stringifyTb4b4b4(Te6edf3rawMessageDataTb4b4b4, Tff7b72nullTb4b4b4, T79c0ff2Tb4b4b4)
Tff7b72}}Tb4b4b4<Tb4b4b4/Tff7b72preTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72detailsTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"px-6 py-4 border-t border-gray-100 dark:border-zinc-800 flex justify-end shrink-0"Tb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"px-4 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-lg text-sm font-bold transition-colors"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3isRawMessageModalOpen Tff7b72= Tff7b72falseTa5d6ff"
Tb4b4b4>
Close
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72TransitionTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72templateTb4b4b4>
Tb4b4b4<Tff7b72scriptTb4b4b4>
Tff7b72import Te6edf3Utils Tff7b72from Ta5d6ff"../../js/Utils"Tb4b4b4;
Tff7b72import Te6edf3DialogUtils Tff7b72from Ta5d6ff"../../js/DialogUtils"Tb4b4b4;
Tff7b72import Te6edf3MicrophoneRecorder Tff7b72from Ta5d6ff"../../js/MicrophoneRecorder"Tb4b4b4;
Tff7b72import Te6edf3WebSocketConnection Tff7b72from Ta5d6ff"../../js/WebSocketConnection"Tb4b4b4;
Tff7b72import Te6edf3AddAudioButton Tff7b72from Ta5d6ff"./AddAudioButton.vue"Tb4b4b4;
Tff7b72import Te6edf3dayjs Tff7b72from Ta5d6ff"dayjs"Tb4b4b4;
Tff7b72import Te6edf3relativeTime Tff7b72from Ta5d6ff"dayjs/plugin/relativeTime"Tb4b4b4;
Te6edf3dayjsTb4b4b4.Te6edf3extendTb4b4b4(Te6edf3relativeTimeTb4b4b4)Tb4b4b4;
Tff7b72import Te6edf3SendMessageButton Tff7b72from Ta5d6ff"./SendMessageButton.vue"Tb4b4b4;
Tff7b72import Te6edf3MaterialDesignIcon Tff7b72from Ta5d6ff"../MaterialDesignIcon.vue"Tb4b4b4;
Tff7b72import Te6edf3ConversationDropDownMenu Tff7b72from Ta5d6ff"./ConversationDropDownMenu.vue"Tb4b4b4;
Tff7b72import Te6edf3AddImageButton Tff7b72from Ta5d6ff"./AddImageButton.vue"Tb4b4b4;
Tff7b72import Te6edf3AudioWaveformPlayer Tff7b72from Ta5d6ff"./AudioWaveformPlayer.vue"Tb4b4b4;
Tff7b72import Te6edf3IconButton Tff7b72from Ta5d6ff"../IconButton.vue"Tb4b4b4;
Tff7b72import Te6edf3LxmfUserIcon Tff7b72from Ta5d6ff"../LxmfUserIcon.vue"Tb4b4b4;
Tff7b72import Te6edf3GlobalEmitter Tff7b72from Ta5d6ff"../../js/GlobalEmitter"Tb4b4b4;
Tff7b72import Te6edf3ToastUtils Tff7b72from Ta5d6ff"../../js/ToastUtils"Tb4b4b4;
Tff7b72import Te6edf3PaperMessageModal Tff7b72from Ta5d6ff"./PaperMessageModal.vue"Tb4b4b4;
Tff7b72import Te6edf3GlobalState Tff7b72from Ta5d6ff"../../js/GlobalState"Tb4b4b4;
Tff7b72import Te6edf3MarkdownRenderer Tff7b72from Ta5d6ff"../../js/MarkdownRenderer"Tb4b4b4;
Tff7b72export Tff7b72default Tb4b4b4{
Te6edf3nameTff7b72: Ta5d6ff"ConversationViewer"Tb4b4b4,
Te6edf3componentsTff7b72: Tb4b4b4{
Te6edf3IconButtonTb4b4b4,
Te6edf3AddImageButtonTb4b4b4,
Te6edf3ConversationDropDownMenuTb4b4b4,
Te6edf3MaterialDesignIconTb4b4b4,
Te6edf3SendMessageButtonTb4b4b4,
Te6edf3AddAudioButtonTb4b4b4,
Te6edf3AudioWaveformPlayerTb4b4b4,
Te6edf3PaperMessageModalTb4b4b4,
Te6edf3LxmfUserIconTb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3propsTff7b72: Tb4b4b4{
Te6edf3configTff7b72: Tb4b4b4{
Te6edf3typeTff7b72: Tffa657ObjectTb4b4b4,
Te6edf3requiredTff7b72: Tff7b72falseTb4b4b4,
Tff7b72defaultTff7b72: Tff7b72nullTb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3myLxmfAddressHashTff7b72: Tb4b4b4{
Te6edf3typeTff7b72: Tffa657StringTb4b4b4,
Te6edf3requiredTff7b72: Tff7b72trueTb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3selectedPeerTff7b72: Tb4b4b4{
Te6edf3typeTff7b72: Tffa657ObjectTb4b4b4,
Te6edf3requiredTff7b72: Tff7b72trueTb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3conversationsTff7b72: Tb4b4b4{
Te6edf3typeTff7b72: Tffa657ArrayTb4b4b4,
Te6edf3requiredTff7b72: Tff7b72trueTb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3emitsTff7b72: Tb4b4b4[Ta5d6ff"close"Tb4b4b4, Ta5d6ff"reload-conversations"Tb4b4b4, Ta5d6ff"update:selectedPeer"Tb4b4b4, Ta5d6ff"update-peer-tracking"Tb4b4b4]Tb4b4b4,
Te6edf3dataTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4{
Te6edf3GlobalStateTb4b4b4,
Te6edf3selectedPeerPathTff7b72: Tff7b72nullTb4b4b4,
Te6edf3selectedPeerLxmfStampInfoTff7b72: Tff7b72nullTb4b4b4,
Te6edf3selectedPeerSignalMetricsTff7b72: Tff7b72nullTb4b4b4,
Te6edf3lxmfMessagesRequestSequenceTff7b72: T79c0ff0Tb4b4b4,
Te6edf3chatItemsTff7b72: Tb4b4b4[Tb4b4b4]Tb4b4b4,
Te6edf3isLoadingPreviousTff7b72: Tff7b72falseTb4b4b4,
Te6edf3hasMorePreviousTff7b72: Tff7b72trueTb4b4b4,
Te6edf3newMessageDeliveryMethodTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newMessageTextTff7b72: Ta5d6ff""Tb4b4b4,
Te6edf3newMessageImagesTff7b72: Tb4b4b4[Tb4b4b4]Tb4b4b4,
Te6edf3newMessageImageUrlsTff7b72: Tb4b4b4[Tb4b4b4]Tb4b4b4,
Te6edf3newMessageAudioTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newMessageTelemetryTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newMessageFilesTff7b72: Tb4b4b4[Tb4b4b4]Tb4b4b4,
Te6edf3isSendingMessageTff7b72: Tff7b72falseTb4b4b4,
Te6edf3autoScrollOnNewMessageTff7b72: Tff7b72trueTb4b4b4,
Te6edf3composeAddressTff7b72: Ta5d6ff""Tb4b4b4,
Te6edf3isComposeInputFocusedTff7b72: Tff7b72falseTb4b4b4,
Te6edf3selectedComposeSuggestionIndexTff7b72: Tff7b72-T79c0ff1Tb4b4b4,
Te6edf3isShareContactModalOpenTff7b72: Tff7b72falseTb4b4b4,
Te6edf3contactsTff7b72: Tb4b4b4[Tb4b4b4]Tb4b4b4,
Te6edf3contactsSearchTff7b72: Ta5d6ff""Tb4b4b4,
Te6edf3isRecordingAudioAttachmentTff7b72: Tff7b72falseTb4b4b4,
Te6edf3audioAttachmentMicrophoneRecorderTff7b72: Tff7b72nullTb4b4b4,
Te6edf3audioAttachmentMicrophoneRecorderCodecTff7b72: Tff7b72nullTb4b4b4,
Te6edf3audioAttachmentRecordingStartedAtTff7b72: Tff7b72nullTb4b4b4,
Te6edf3audioAttachmentRecordingDurationTff7b72: Tff7b72nullTb4b4b4,
Te6edf3audioAttachmentRecordingTimerTff7b72: Tff7b72nullTb4b4b4,
Te6edf3lxmfMessageAudioAttachmentCacheTff7b72: Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3isDownloadingAudioTff7b72: Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3expandedMessageInfoTff7b72: Tff7b72nullTb4b4b4,
Te6edf3imageModalUrlTff7b72: Tff7b72nullTb4b4b4,
Te6edf3isSelectedPeerBlockedTff7b72: Tff7b72falseTb4b4b4,
Te6edf3isGeneratingPaperMessageTff7b72: Tff7b72falseTb4b4b4,
Te6edf3generatedPaperMessageUriTff7b72: Tff7b72nullTb4b4b4,
Te6edf3isPaperMessageResultModalOpenTff7b72: Tff7b72falseTb4b4b4,
Te6edf3lxmfAudioModeToCodec2ModeMapTff7b72: Tb4b4b4{
T8b949e// https://github.com/markqvist/LXMF/blob/master/LXMF/LXMF.py#L21
T79c0ff0x01Tff7b72: Ta5d6ff"450PWB"Tb4b4b4, T8b949e// AM_CODEC2_450PWB
T79c0ff0x02Tff7b72: Ta5d6ff"450"Tb4b4b4, T8b949e// AM_CODEC2_450
T79c0ff0x03Tff7b72: Ta5d6ff"700C"Tb4b4b4, T8b949e// AM_CODEC2_700C
T79c0ff0x04Tff7b72: Ta5d6ff"1200"Tb4b4b4, T8b949e// AM_CODEC2_1200
T79c0ff0x05Tff7b72: Ta5d6ff"1300"Tb4b4b4, T8b949e// AM_CODEC2_1300
T79c0ff0x06Tff7b72: Ta5d6ff"1400"Tb4b4b4, T8b949e// AM_CODEC2_1400
T79c0ff0x07Tff7b72: Ta5d6ff"1600"Tb4b4b4, T8b949e// AM_CODEC2_1600
T79c0ff0x08Tff7b72: Ta5d6ff"2400"Tb4b4b4, T8b949e// AM_CODEC2_2400
T79c0ff0x09Tff7b72: Ta5d6ff"3200"Tb4b4b4, T8b949e// AM_CODEC2_3200
Tb4b4b4}Tb4b4b4,
Te6edf3isPaperMessageModalOpenTff7b72: Tff7b72falseTb4b4b4,
Te6edf3paperMessageHashTff7b72: Tff7b72nullTb4b4b4,
Te6edf3isRawMessageModalOpenTff7b72: Tff7b72falseTb4b4b4,
Te6edf3rawMessageDataTff7b72: Tff7b72nullTb4b4b4,
Te6edf3hasTranslatorTff7b72: Tff7b72falseTb4b4b4,
Te6edf3translatorLanguagesTff7b72: Tb4b4b4[Tb4b4b4]Tb4b4b4,
Te6edf3propagationNodeStatusTff7b72: Tff7b72nullTb4b4b4,
Te6edf3propagationStatusIntervalTff7b72: Tff7b72nullTb4b4b4,
Te6edf3showTelemetryInChatTff7b72: Tff7b72falseTb4b4b4,
Te6edf3isTelemetryHistoryModalOpenTff7b72: Tff7b72falseTb4b4b4,
Te6edf3replyingToTff7b72: Tff7b72nullTb4b4b4,
Te6edf3messageContextMenuTff7b72: Tb4b4b4{
Te6edf3showTff7b72: Tff7b72falseTb4b4b4,
Te6edf3xTff7b72: T79c0ff0Tb4b4b4,
Te6edf3yTff7b72: T79c0ff0Tb4b4b4,
Te6edf3chatItemTff7b72: Tff7b72nullTb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3nowTff7b72: Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3updateTimerTff7b72: Tff7b72nullTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3computedTff7b72: Tb4b4b4{
Te6edf3bubbleStylesTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4(Te6edf3chatItemTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3styles Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4;
Tff7b72const Te6edf3isFailed Tff7b72= Tb4b4b4[Ta5d6ff"cancelled"Tb4b4b4, Ta5d6ff"failed"Tb4b4b4]Tb4b4b4.Te6edf3includesTb4b4b4(Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3stateTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3isFailedTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3color Tff7b72= Te6edf3GlobalStateTb4b4b4.Te6edf3configTb4b4b4.Te6edf3message_failed_bubble_color Tff7b72|| Ta5d6ff"#ef4444"Tb4b4b4;
Te6edf3stylesTb4b4b4[Ta5d6ff"background-color"Tb4b4b4] Tff7b72= Te6edf3colorTb4b4b4;
Te6edf3stylesTb4b4b4[Ta5d6ff"color"Tb4b4b4] Tff7b72= Ta5d6ff"#ffffff"Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3chatItemTb4b4b4.Te6edf3is_outboundTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3color Tff7b72= Te6edf3GlobalStateTb4b4b4.Te6edf3configTb4b4b4.Te6edf3message_outbound_bubble_color Tff7b72|| Ta5d6ff"#4f46e5"Tb4b4b4;
Te6edf3stylesTb4b4b4[Ta5d6ff"background-color"Tb4b4b4] Tff7b72= Te6edf3colorTb4b4b4;
Te6edf3stylesTb4b4b4[Ta5d6ff"color"Tb4b4b4] Tff7b72= Ta5d6ff"#ffffff"Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3GlobalStateTb4b4b4.Te6edf3configTb4b4b4.Te6edf3message_inbound_bubble_colorTb4b4b4) Tb4b4b4{
Te6edf3stylesTb4b4b4[Ta5d6ff"background-color"Tb4b4b4] Tff7b72= Te6edf3GlobalStateTb4b4b4.Te6edf3configTb4b4b4.Te6edf3message_inbound_bubble_colorTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3stylesTb4b4b4;
Tb4b4b4}Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3messageIconStyleTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3size Tff7b72= Tffa657NumberTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3configTff7b72?Tb4b4b4.Te6edf3message_icon_sizeTb4b4b4) Tff7b72|| T79c0ff28Tb4b4b4;
Tff7b72return Tb4b4b4{
Te6edf3widthTff7b72: Ta5d6ff`Tffd700${Te6edf3sizeTffd700}Ta5d6ffpxTa5d6ff`Tb4b4b4,
Te6edf3heightTff7b72: Ta5d6ff`Tffd700${Te6edf3sizeTffd700}Ta5d6ffpxTa5d6ff`Tb4b4b4,
Te6edf3minWidthTff7b72: Ta5d6ff`Tffd700${Te6edf3sizeTffd700}Ta5d6ffpxTa5d6ff`Tb4b4b4,
Te6edf3minHeightTff7b72: Ta5d6ff`Tffd700${Te6edf3sizeTffd700}Ta5d6ffpxTa5d6ff`Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3isSyncingPropagationNodeTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4[
Ta5d6ff"path_requested"Tb4b4b4,
Ta5d6ff"link_establishing"Tb4b4b4,
Ta5d6ff"link_established"Tb4b4b4,
Ta5d6ff"request_sent"Tb4b4b4,
Ta5d6ff"receiving"Tb4b4b4,
Ta5d6ff"response_received"Tb4b4b4,
Tb4b4b4]Tb4b4b4.Te6edf3includesTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3propagationNodeStatusTff7b72?Tb4b4b4.Te6edf3stateTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3blockedDestinationsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3GlobalStateTb4b4b4.Te6edf3blockedDestinationsTb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3filteredContactsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3contactsSearchTb4b4b4) Tff7b72return Tff7b72thisTb4b4b4.Te6edf3contactsTb4b4b4;
Tff7b72const Te6edf3s Tff7b72= Tff7b72thisTb4b4b4.Te6edf3contactsSearchTb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3contactsTb4b4b4.Te6edf3filterTb4b4b4(
Tb4b4b4(Te6edf3cTb4b4b4) Tb4b4b4=> Te6edf3cTb4b4b4.Te6edf3nameTb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3includesTb4b4b4(Te6edf3sTb4b4b4) Tff7b72|| Te6edf3cTb4b4b4.Te6edf3remote_identity_hashTb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3includesTb4b4b4(Te6edf3sTb4b4b4)
Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3isMobileTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/iTb4b4b4.Te6edf3testTb4b4b4(Te6edf3navigatorTb4b4b4.Te6edf3userAgentTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3latestConversationsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3conversationsTb4b4b4.Te6edf3sliceTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff4Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3composeSuggestionsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3isComposeInputFocusedTb4b4b4) Tff7b72return Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3search Tff7b72= Tff7b72thisTb4b4b4.Te6edf3composeAddressTb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3suggestions Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3seenHashes Tff7b72= Tff7b72new Tffa657SetTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// 1. Check contacts
Tff7b72thisTb4b4b4.Te6edf3contactsTb4b4b4.Te6edf3forEachTb4b4b4(Tb4b4b4(Te6edf3cTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3hash Tff7b72= Te6edf3cTb4b4b4.Te6edf3remote_identity_hashTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3seenHashesTb4b4b4.Te6edf3hasTb4b4b4(Te6edf3hashTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3search Tff7b72|| Te6edf3cTb4b4b4.Te6edf3nameTb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3includesTb4b4b4(Te6edf3searchTb4b4b4) Tff7b72|| Te6edf3hashTb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3includesTb4b4b4(Te6edf3searchTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3suggestionsTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4{
Te6edf3nameTff7b72: Te6edf3cTb4b4b4.Te6edf3nameTb4b4b4,
Te6edf3hashTff7b72: Te6edf3hashTb4b4b4,
Te6edf3typeTff7b72: Ta5d6ff"contact"Tb4b4b4,
Te6edf3iconTff7b72: Ta5d6ff"account"Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3seenHashesTb4b4b4.Te6edf3addTb4b4b4(Te6edf3hashTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4)Tb4b4b4;
T8b949e// 2. Check recent conversations
Tff7b72thisTb4b4b4.Te6edf3conversationsTb4b4b4.Te6edf3forEachTb4b4b4(Tb4b4b4(Te6edf3cTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3hash Tff7b72= Te6edf3cTb4b4b4.Te6edf3destination_hashTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3seenHashesTb4b4b4.Te6edf3hasTb4b4b4(Te6edf3hashTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3name Tff7b72= Te6edf3cTb4b4b4.Te6edf3custom_display_name Tff7b72?? Te6edf3cTb4b4b4.Te6edf3display_nameTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3search Tff7b72|| Te6edf3nameTb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3includesTb4b4b4(Te6edf3searchTb4b4b4) Tff7b72|| Te6edf3hashTb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3includesTb4b4b4(Te6edf3searchTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3suggestionsTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4{
Te6edf3nameTff7b72: Te6edf3nameTb4b4b4,
Te6edf3hashTff7b72: Te6edf3hashTb4b4b4,
Te6edf3typeTff7b72: Ta5d6ff"recent"Tb4b4b4,
Te6edf3iconTff7b72: Ta5d6ff"history"Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3seenHashesTb4b4b4.Te6edf3addTb4b4b4(Te6edf3hashTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3suggestionsTb4b4b4.Te6edf3sliceTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff10Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3canSendMessageTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// can send if message text is present
Tff7b72const Te6edf3messageText Tff7b72= Tff7b72thisTb4b4b4.Te6edf3newMessageTextTb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3hasText Tff7b72= Te6edf3messageText Tff7b72!= Tff7b72null Tff7b72&& Te6edf3messageText Tff7b72!== Ta5d6ff""Tb4b4b4;
T8b949e// or if any attachments are present
Tff7b72const Te6edf3hasAttachments Tff7b72=
Tff7b72thisTb4b4b4.Te6edf3newMessageImagesTb4b4b4.Te6edf3length Tff7b72> T79c0ff0 Tff7b72||
Tff7b72thisTb4b4b4.Te6edf3newMessageAudio Tff7b72!= Tff7b72null Tff7b72||
Tff7b72thisTb4b4b4.Te6edf3newMessageFilesTb4b4b4.Te6edf3length Tff7b72> T79c0ff0 Tff7b72||
Tff7b72thisTb4b4b4.Te6edf3newMessageTelemetry Tff7b72!= Tff7b72nullTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3hasText Tff7b72&& Tff7b72!Te6edf3hasAttachmentsTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
T8b949e// can't send if already sending
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3isSendingMessageTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3selectedPeerChatItemsTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// get all chat items related to the selected peer
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3chatItemsTb4b4b4.Te6edf3filterTb4b4b4(Tb4b4b4(Te6edf3chatItemTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3chatItemTb4b4b4.Te6edf3type Tff7b72=== Ta5d6ff"lxmf_message"Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3isFromSelectedPeer Tff7b72=
Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3source_hash Tff7b72=== Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4.Te6edf3destination_hashTb4b4b4;
Tff7b72const Te6edf3isToSelectedPeer Tff7b72=
Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3destination_hash Tff7b72=== Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4.Te6edf3destination_hashTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Tb4b4b4(Te6edf3isFromSelectedPeer Tff7b72|| Te6edf3isToSelectedPeerTb4b4b4)Tb4b4b4) Tff7b72return Tff7b72falseTb4b4b4;
T8b949e// filter telemetry if disabled
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3showTelemetryInChat Tff7b72&& Tff7b72thisTb4b4b4.Te6edf3isTelemetryOnlyTb4b4b4(Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e// no peer, so no chat items!
Tff7b72return Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3selectedPeerTelemetryItemsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4) Tff7b72return Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3chatItems
Tb4b4b4.Te6edf3filterTb4b4b4(Tb4b4b4(Te6edf3chatItemTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3chatItemTb4b4b4.Te6edf3type Tff7b72=== Ta5d6ff"lxmf_message"Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3isFromSelectedPeer Tff7b72=
Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3source_hash Tff7b72=== Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4.Te6edf3destination_hashTb4b4b4;
Tff7b72const Te6edf3isToSelectedPeer Tff7b72=
Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3destination_hash Tff7b72=== Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4.Te6edf3destination_hashTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Tb4b4b4(Te6edf3isFromSelectedPeer Tff7b72|| Te6edf3isToSelectedPeerTb4b4b4)Tb4b4b4) Tff7b72return Tff7b72falseTb4b4b4;
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3isTelemetryOnlyTb4b4b4(Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}Tb4b4b4)
Tb4b4b4.Te6edf3reverseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3selectedPeerChatItemsReversedTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// ensure a copy of the array is returned in reverse order
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3selectedPeerChatItemsTb4b4b4.Te6edf3mapTb4b4b4(Tb4b4b4(Te6edf3messageTb4b4b4) Tb4b4b4=> Te6edf3messageTb4b4b4)Tb4b4b4.Te6edf3reverseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3oldestMessageIdTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3selectedPeerChatItemsTb4b4b4.Te6edf3length Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3selectedPeerChatItemsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3idTb4b4b4;
Tb4b4b4}
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3hasFailedOrCancelledMessagesTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3selectedPeerChatItemsTb4b4b4.Te6edf3someTb4b4b4(
Tb4b4b4(Te6edf3itemTb4b4b4) Tb4b4b4=> Te6edf3itemTb4b4b4.Te6edf3is_outbound Tff7b72&& Tb4b4b4[Ta5d6ff"failed"Tb4b4b4, Ta5d6ff"cancelled"Tb4b4b4]Tb4b4b4.Te6edf3includesTb4b4b4(Te6edf3itemTb4b4b4.Te6edf3lxmf_messageTff7b72?Tb4b4b4.Te6edf3stateTb4b4b4)
Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3telemetryBatteryHistoryTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3selectedPeerTelemetryItems
Tb4b4b4.Te6edf3filterTb4b4b4(Tb4b4b4(Te6edf3itemTb4b4b4) Tb4b4b4=> Te6edf3itemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTff7b72?Tb4b4b4.Te6edf3telemetryTff7b72?Tb4b4b4.Te6edf3batteryTb4b4b4)
Tb4b4b4.Te6edf3mapTb4b4b4(Tb4b4b4(Te6edf3itemTb4b4b4) Tb4b4b4=> Tb4b4b4(Tb4b4b4{
Te6edf3xTff7b72: Te6edf3itemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3timestampTb4b4b4,
Te6edf3yTff7b72: Te6edf3itemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3telemetryTb4b4b4.Te6edf3batteryTb4b4b4.Te6edf3charge_percentTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4)
Tb4b4b4.Te6edf3sortTb4b4b4(Tb4b4b4(Te6edf3aTb4b4b4, Te6edf3bTb4b4b4) Tb4b4b4=> Te6edf3aTb4b4b4.Te6edf3x Tff7b72- Te6edf3bTb4b4b4.Te6edf3xTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3batterySparklinePathTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3history Tff7b72= Tff7b72thisTb4b4b4.Te6edf3telemetryBatteryHistoryTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3historyTb4b4b4.Te6edf3length Tff7b72< T79c0ff2Tb4b4b4) Tff7b72return Ta5d6ff""Tb4b4b4;
Tff7b72const Te6edf3minX Tff7b72= Te6edf3historyTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4.Te6edf3xTb4b4b4;
Tff7b72const Te6edf3maxX Tff7b72= Te6edf3historyTb4b4b4[Te6edf3historyTb4b4b4.Te6edf3length Tff7b72- T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3xTb4b4b4;
Tff7b72const Te6edf3rangeX Tff7b72= Te6edf3maxX Tff7b72- Te6edf3minX Tff7b72|| T79c0ff1Tb4b4b4;
Tff7b72return Te6edf3history
Tb4b4b4.Te6edf3mapTb4b4b4(Tb4b4b4(Te6edf3pTb4b4b4, Te6edf3iTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3x Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3pTb4b4b4.Te6edf3x Tff7b72- Te6edf3minXTb4b4b4) Tff7b72/ Te6edf3rangeXTb4b4b4) Tff7b72* T79c0ff100Tb4b4b4;
Tff7b72const Te6edf3y Tff7b72= T79c0ff100 Tff7b72- Te6edf3pTb4b4b4.Te6edf3yTb4b4b4; T8b949e// SVG y is top-down
Tff7b72return Ta5d6ff`Tffd700${Te6edf3i Tff7b72=== T79c0ff0 Tff7b72? Ta5d6ff"M" Tff7b72: Ta5d6ff"L"Tffd700}Ta5d6ff Tffd700${Te6edf3xTffd700}Ta5d6ff Tffd700${Te6edf3yTffd700}Ta5d6ff`Tb4b4b4;
Tb4b4b4}Tb4b4b4)
Tb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff" "Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3watchTff7b72: Tb4b4b4{
Te6edf3selectedPeerTff7b72: Tb4b4b4{
Te6edf3handlerTb4b4b4(Te6edf3newPeerTb4b4b4, Te6edf3oldPeerTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3oldPeerTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3saveDraftTb4b4b4(Te6edf3oldPeerTb4b4b4.Te6edf3destination_hashTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3checkIfSelectedPeerBlockedTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3initialLoadTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3newPeerTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3loadDraftTb4b4b4(Te6edf3newPeerTb4b4b4.Te6edf3destination_hashTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3immediateTff7b72: Tff7b72trueTb4b4b4,
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3selectedPeerChatItemsTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// chat items for selected peer changed, so lets process any available audio
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3processAudioForSelectedPeerChatItemsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3newMessageTextTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3$nextTickTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3adjustTextareaHeightTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Ta5d6ff"config.translator_enabled"Tff7b72: Tb4b4b4{
Te6edf3handlerTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3checkTranslatorTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3blockedDestinationsTff7b72: Tb4b4b4{
Te6edf3handlerTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3checkIfSelectedPeerBlockedTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3deepTff7b72: Tff7b72trueTb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3mountedTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3updateTimer Tff7b72= Te6edf3setIntervalTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3now Tff7b72= Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4, T79c0ff30000Tb4b4b4)Tb4b4b4; T8b949e// Update every 30 seconds
T8b949e// listen for websocket messages
Te6edf3WebSocketConnectionTb4b4b4.Te6edf3onTb4b4b4(Ta5d6ff"message"Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3onWebsocketMessageTb4b4b4)Tb4b4b4;
T8b949e// listen for compose new message event
Te6edf3GlobalEmitterTb4b4b4.Te6edf3onTb4b4b4(Ta5d6ff"compose-new-message"Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3onComposeNewMessageEventTb4b4b4)Tb4b4b4;
T8b949e// check translator
Tff7b72thisTb4b4b4.Te6edf3checkTranslatorTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// fetch contacts for suggestions
Tff7b72thisTb4b4b4.Te6edf3fetchContactsTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// fetch propagation status
Tff7b72thisTb4b4b4.Te6edf3updatePropagationNodeStatusTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3propagationStatusInterval Tff7b72= Te6edf3setIntervalTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3updatePropagationNodeStatusTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4, T79c0ff2000Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3beforeUnmountTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3updateTimerTb4b4b4) Tb4b4b4{
Te6edf3clearIntervalTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3updateTimerTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e// stop listening for websocket messages
Te6edf3WebSocketConnectionTb4b4b4.Te6edf3offTb4b4b4(Ta5d6ff"message"Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3onWebsocketMessageTb4b4b4)Tb4b4b4;
Te6edf3GlobalEmitterTb4b4b4.Te6edf3offTb4b4b4(Ta5d6ff"compose-new-message"Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3onComposeNewMessageEventTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3propagationStatusIntervalTb4b4b4) Tb4b4b4{
Te6edf3clearIntervalTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3propagationStatusIntervalTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3methodsTff7b72: Tb4b4b4{
Te6edf3renderMarkdownTb4b4b4(Te6edf3textTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3MarkdownRendererTb4b4b4.Te6edf3renderTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3handleMessageClickTb4b4b4(Te6edf3eventTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3nomadnetLink Tff7b72= Te6edf3eventTb4b4b4.Te6edf3targetTb4b4b4.Te6edf3closestTb4b4b4(Ta5d6ff".nomadnet-link"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3nomadnetLinkTb4b4b4) Tb4b4b4{
Te6edf3eventTb4b4b4.Te6edf3preventDefaultTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3url Tff7b72= Te6edf3nomadnetLinkTb4b4b4.Te6edf3getAttributeTb4b4b4(Ta5d6ff"data-nomadnet-url"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3urlTb4b4b4) Tb4b4b4{
Tff7b72const Tb4b4b4[Te6edf3hashTb4b4b4, Tb4b4b4...Te6edf3pathPartsTb4b4b4] Tff7b72= Te6edf3urlTb4b4b4.Te6edf3splitTb4b4b4(Ta5d6ff":"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3path Tff7b72= Te6edf3pathPartsTb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff":"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3routeName Tff7b72= Tff7b72thisTb4b4b4.Te6edf3$routeTb4b4b4.Te6edf3metaTb4b4b4.Te6edf3isPopout Tff7b72? Ta5d6ff"nomadnetwork-popout" Tff7b72: Ta5d6ff"nomadnetwork"Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3$routerTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4{
Te6edf3nameTff7b72: Te6edf3routeNameTb4b4b4,
Te6edf3paramsTff7b72: Tb4b4b4{ Te6edf3destinationHashTff7b72: Te6edf3hash Tb4b4b4}Tb4b4b4,
Te6edf3queryTff7b72: Tb4b4b4{ Te6edf3pathTff7b72: Te6edf3path Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72const Te6edf3lxmfLink Tff7b72= Te6edf3eventTb4b4b4.Te6edf3targetTb4b4b4.Te6edf3closestTb4b4b4(Ta5d6ff".lxmf-link"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3lxmfLinkTb4b4b4) Tb4b4b4{
Te6edf3eventTb4b4b4.Te6edf3preventDefaultTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3address Tff7b72= Te6edf3lxmfLinkTb4b4b4.Te6edf3getAttributeTb4b4b4(Ta5d6ff"data-lxmf-address"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3addressTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3$routerTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4{
Te6edf3nameTff7b72: Ta5d6ff"messages"Tb4b4b4,
Te6edf3paramsTff7b72: Tb4b4b4{ Te6edf3destinationHashTff7b72: Te6edf3address Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3updatePropagationNodeStatusTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3getTb4b4b4(Ta5d6ff"/api/v1/lxmf/propagation-node/status"Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3propagationNodeStatus Tff7b72= Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3propagation_node_statusTb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// do nothing on error
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3syncPropagationNodeTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3GlobalEmitterTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"sync-propagation-node"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3copyMyAddressTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72await Te6edf3navigatorTb4b4b4.Te6edf3clipboardTb4b4b4.Te6edf3writeTextTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3myLxmfAddressHashTb4b4b4)Tb4b4b4;
Te6edf3ToastUtilsTb4b4b4.Te6edf3successTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"messages.address_copied"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3errorTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
Te6edf3ToastUtilsTb4b4b4.Te6edf3errorTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"messages.failed_copy_address"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3focusComposeInputTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3$nextTickTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3input Tff7b72= Tffa657documentTb4b4b4.Te6edf3getElementByIdTb4b4b4(Ta5d6ff"compose-input"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3inputTb4b4b4) Tb4b4b4{
Te6edf3inputTb4b4b4.Te6edf3focusTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3fetchContactsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3getTb4b4b4(Ta5d6ff"/api/v1/telephone/contacts"Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3contacts Tff7b72= Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"Failed to fetch contacts:"Tb4b4b4, Te6edf3eTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3checkTranslatorTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3configTff7b72?Tb4b4b4.Te6edf3translator_enabledTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3hasTranslator Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3getTb4b4b4(Ta5d6ff"/api/v1/translator/languages"Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3translatorLanguages Tff7b72= Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3languages Tff7b72|| Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3hasTranslator Tff7b72= Tff7b72thisTb4b4b4.Te6edf3translatorLanguagesTb4b4b4.Te6edf3length Tff7b72> T79c0ff0Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"Failed to check translator:"Tb4b4b4, Te6edf3eTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3hasTranslator Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3translateMessageTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3newMessageText Tff7b72|| Tff7b72thisTb4b4b4.Te6edf3isSendingMessageTb4b4b4) Tff7b72returnTb4b4b4;
Tff7b72try Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3isSendingMessage Tff7b72= Tff7b72trueTb4b4b4;
Tff7b72const Te6edf3targetLang Tff7b72= Tff7b72thisTb4b4b4.Te6edf3$i18nTb4b4b4.Te6edf3locale Tff7b72|| Ta5d6ff"en"Tb4b4b4;
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3postTb4b4b4(Ta5d6ff"/api/v1/translator/translate"Tb4b4b4, Tb4b4b4{
Te6edf3textTff7b72: Tff7b72thisTb4b4b4.Te6edf3newMessageTextTb4b4b4,
Te6edf3source_langTff7b72: Ta5d6ff"auto"Tb4b4b4,
Te6edf3target_langTff7b72: Te6edf3targetLangTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3translated_textTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3newMessageText Tff7b72= Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3translated_textTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3$nextTickTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3adjustTextareaHeightTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3errorTb4b4b4(Ta5d6ff"Translation failed:"Tb4b4b4, Te6edf3eTb4b4b4)Tb4b4b4;
Te6edf3ToastUtilsTb4b4b4.Te6edf3errorTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"messages.translation_failed"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72finally Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3isSendingMessage Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3adjustTextareaHeightTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3textarea Tff7b72= Tff7b72thisTb4b4b4.Te6edf3$refsTb4b4b4[Ta5d6ff"message-input"Tb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3textareaTb4b4b4) Tb4b4b4{
Te6edf3textareaTb4b4b4.Te6edf3styleTb4b4b4.Te6edf3height Tff7b72= Ta5d6ff"auto"Tb4b4b4;
Te6edf3textareaTb4b4b4.Te6edf3styleTb4b4b4.Te6edf3height Tff7b72= Tffa657MathTb4b4b4.Te6edf3minTb4b4b4(Te6edf3textareaTb4b4b4.Te6edf3scrollHeightTb4b4b4, T79c0ff200Tb4b4b4) Tff7b72+ Ta5d6ff"px"Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3checkIfSelectedPeerBlockedTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3isSelectedPeerBlocked Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3isSelectedPeerBlocked Tff7b72= Te6edf3GlobalStateTb4b4b4.Te6edf3blockedDestinationsTb4b4b4.Te6edf3someTb4b4b4(
Tb4b4b4(Te6edf3bTb4b4b4) Tb4b4b4=> Te6edf3bTb4b4b4.Te6edf3destination_hash Tff7b72=== Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4.Te6edf3destination_hash
Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3loadDraftTb4b4b4(Te6edf3destinationHashTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3drafts Tff7b72= Tffa657JSONTb4b4b4.Te6edf3parseTb4b4b4(Te6edf3localStorageTb4b4b4.Te6edf3getItemTb4b4b4(Ta5d6ff"meshchat.drafts"Tb4b4b4) Tff7b72|| Ta5d6ff"{}"Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3newMessageText Tff7b72= Te6edf3draftsTb4b4b4[Te6edf3destinationHashTb4b4b4] Tff7b72|| Ta5d6ff""Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3$nextTickTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3adjustTextareaHeightTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3errorTb4b4b4(Ta5d6ff"Failed to load draft:"Tb4b4b4, Te6edf3eTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3saveDraftTb4b4b4(Te6edf3destinationHashTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3drafts Tff7b72= Tffa657JSONTb4b4b4.Te6edf3parseTb4b4b4(Te6edf3localStorageTb4b4b4.Te6edf3getItemTb4b4b4(Ta5d6ff"meshchat.drafts"Tb4b4b4) Tff7b72|| Ta5d6ff"{}"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3newMessageTextTb4b4b4) Tb4b4b4{
Te6edf3draftsTb4b4b4[Te6edf3destinationHashTb4b4b4] Tff7b72= Tff7b72thisTb4b4b4.Te6edf3newMessageTextTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72delete Te6edf3draftsTb4b4b4[Te6edf3destinationHashTb4b4b4]Tb4b4b4;
Tb4b4b4}
Te6edf3localStorageTb4b4b4.Te6edf3setItemTb4b4b4(Ta5d6ff"meshchat.drafts"Tb4b4b4, Tffa657JSONTb4b4b4.Te6edf3stringifyTb4b4b4(Te6edf3draftsTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3errorTb4b4b4(Ta5d6ff"Failed to save draft:"Tb4b4b4, Te6edf3eTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3closeTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3$emitTb4b4b4(Ta5d6ff"close"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3onMessagesScrollTb4b4b4(Te6edf3eventTb4b4b4) Tb4b4b4{
T8b949e// check if messages is scrolled to bottom
Tff7b72const Te6edf3element Tff7b72= Te6edf3eventTb4b4b4.Te6edf3targetTb4b4b4;
Tff7b72const Te6edf3isAtBottom Tff7b72= Te6edf3elementTb4b4b4.Te6edf3scrollTop Tff7b72=== Te6edf3elementTb4b4b4.Te6edf3scrollHeight Tff7b72- Te6edf3elementTb4b4b4.Te6edf3offsetHeightTb4b4b4;
T8b949e// we want to auto scroll if user is at bottom of messages list
Tff7b72thisTb4b4b4.Te6edf3autoScrollOnNewMessage Tff7b72= Te6edf3isAtBottomTb4b4b4;
T8b949e// load previous when scrolling near top of page
Tff7b72if Tb4b4b4(Te6edf3elementTb4b4b4.Te6edf3scrollTop Tff7b72<= T79c0ff500Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3loadPreviousTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3initialLoadTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// reset
Tff7b72thisTb4b4b4.Te6edf3chatItems Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3hasMorePrevious Tff7b72= Tff7b72trueTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3selectedPeerPath Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3selectedPeerLxmfStampInfo Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3selectedPeerSignalMetrics Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3getPeerPathTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3getPeerLxmfStampInfoTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3getPeerSignalMetricsTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// mark as read
Tff7b72thisTb4b4b4.Te6edf3markConversationAsReadTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4)Tb4b4b4;
T8b949e// load 1 page of previous messages
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3loadPreviousTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// scroll to bottom
Tff7b72thisTb4b4b4.Te6edf3scrollMessagesToBottomTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// auto load audio
Tff7b72thisTb4b4b4.Te6edf3autoLoadAudioAttachmentsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3loadPreviousTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// do nothing if already loading
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3isLoadingPreviousTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3isLoadingPrevious Tff7b72= Tff7b72trueTb4b4b4;
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3seq Tff7b72= Tff7b72++Tff7b72thisTb4b4b4.Te6edf3lxmfMessagesRequestSequenceTb4b4b4;
T8b949e// fetch lxmf messages from "us to destination" and from "destination to us"
Tff7b72const Te6edf3pageSize Tff7b72= T79c0ff30Tb4b4b4;
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3getTb4b4b4(
Ta5d6ff`Ta5d6ff/api/v1/lxmf-messages/conversation/Tffd700${Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4.Te6edf3destination_hashTffd700}Ta5d6ff`Tb4b4b4,
Tb4b4b4{
Te6edf3paramsTff7b72: Tb4b4b4{
Te6edf3countTff7b72: Te6edf3pageSizeTb4b4b4,
Te6edf3orderTff7b72: Ta5d6ff"desc"Tb4b4b4,
Te6edf3after_idTff7b72: Tff7b72thisTb4b4b4.Te6edf3oldestMessageIdTb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}
Tb4b4b4)Tb4b4b4;
T8b949e// do nothing if response is for a previous request
Tff7b72if Tb4b4b4(Te6edf3seq Tff7b72!== Tff7b72thisTb4b4b4.Te6edf3lxmfMessagesRequestSequenceTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"ignoring response for previous lxmf messages request"Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// convert lxmf messages to chat items
Tff7b72const Te6edf3chatItems Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3lxmfMessages Tff7b72= Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3lxmf_messagesTb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3lxmfMessage Tff7b72of Te6edf3lxmfMessagesTb4b4b4) Tb4b4b4{
Te6edf3chatItemsTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4{
Te6edf3typeTff7b72: Ta5d6ff"lxmf_message"Tb4b4b4,
Te6edf3is_outboundTff7b72: Tff7b72thisTb4b4b4.Te6edf3myLxmfAddressHash Tff7b72=== Te6edf3lxmfMessageTb4b4b4.Te6edf3source_hashTb4b4b4,
Te6edf3lxmf_messageTff7b72: Te6edf3lxmfMessageTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e// add messages to start of existing messages
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3chatItem Tff7b72of Te6edf3chatItemsTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3chatItemsTb4b4b4.Te6edf3unshiftTb4b4b4(Te6edf3chatItemTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e// no more previous to load if received items is less than expected page size
Tff7b72if Tb4b4b4(Te6edf3chatItemsTb4b4b4.Te6edf3length Tff7b72< Te6edf3pageSizeTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3hasMorePrevious Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
T8b949e// auto load audio
Tff7b72thisTb4b4b4.Te6edf3autoLoadAudioAttachmentsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// do nothing
Tb4b4b4} Tff7b72finally Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3isLoadingPrevious Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3getParsedItemsTb4b4b4(Te6edf3chatItemTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3content Tff7b72= Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3contentTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3contentTb4b4b4) Tff7b72return Tff7b72nullTb4b4b4;
Tff7b72const Te6edf3items Tff7b72= Tb4b4b4{
Te6edf3contactTff7b72: Tff7b72nullTb4b4b4,
Te6edf3paperMessageTff7b72: Tff7b72nullTb4b4b4,
Tb4b4b4}Tb4b4b4;
T8b949e// Parse contact: Contact: ivan <ca314c30b27eacec5f6ca6ac504e94c9> [LXMF: ...] [LXST: ...]
Tff7b72const Te6edf3contactMatch Tff7b72= Te6edf3contentTb4b4b4.Te6edf3matchTb4b4b4(
T8b949e// eslint-disable-next-line security/detect-unsafe-regex -- bounded pattern, single-line contact header
Ta5d6ff/^Contact:\s+(.+?)\s+<([a-fA-F0-9]{32})>(?:\s+\[LXMF:\s+([a-fA-F0-9]{32})\])?(?:\s+\[LXST:\s+([a-fA-F0-9]{32})\])?/i
Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3contactMatchTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3contactHash Tff7b72= Te6edf3contactMatchTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3lxmfAddress Tff7b72= Te6edf3contactMatchTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3lxstAddress Tff7b72= Te6edf3contactMatchTb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4;
T8b949e// try to find enriched info from existing conversations/peers
Tff7b72const Te6edf3existing Tff7b72= Tff7b72thisTb4b4b4.Te6edf3conversationsTb4b4b4.Te6edf3findTb4b4b4(
Tb4b4b4(Te6edf3cTb4b4b4) Tb4b4b4=>
Te6edf3cTb4b4b4.Te6edf3destination_hash Tff7b72=== Te6edf3contactHash Tff7b72||
Te6edf3cTb4b4b4.Te6edf3destination_hash Tff7b72=== Te6edf3lxmfAddress Tff7b72||
Te6edf3cTb4b4b4.Te6edf3destination_hash Tff7b72=== Te6edf3lxstAddress
Tb4b4b4)Tb4b4b4;
Te6edf3itemsTb4b4b4.Te6edf3contact Tff7b72= Tb4b4b4{
Te6edf3nameTff7b72: Te6edf3contactMatchTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4,
Te6edf3hashTff7b72: Te6edf3contactHashTb4b4b4,
Te6edf3lxmf_addressTff7b72: Te6edf3lxmfAddressTb4b4b4,
Te6edf3lxst_addressTff7b72: Te6edf3lxstAddressTb4b4b4,
Te6edf3custom_imageTff7b72: Te6edf3existingTff7b72?Tb4b4b4.Te6edf3contact_imageTb4b4b4,
Te6edf3lxmf_user_iconTff7b72: Te6edf3existingTff7b72?Tb4b4b4.Te6edf3lxmf_user_iconTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}
T8b949e// Parse paper message link
Tff7b72const Te6edf3paperMatch Tff7b72= Te6edf3contentTb4b4b4.Te6edf3matchTb4b4b4(Ta5d6ff/(lxm|lxmf):\/\/[a-zA-Z0-9+/=._-]+/iTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3paperMatchTb4b4b4) Tb4b4b4{
Te6edf3itemsTb4b4b4.Te6edf3paperMessage Tff7b72= Te6edf3paperMatchTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4;
T8b949e// if content is only the paper message, or it already contains the detected text,
T8b949e// we'll hide the raw content div to avoid double rendering.
Tff7b72const Te6edf3trimmedContent Tff7b72= Te6edf3contentTb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3trimmedContent Tff7b72=== Te6edf3itemsTb4b4b4.Te6edf3paperMessage Tff7b72|| Te6edf3trimmedContentTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"Paper Message detected"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3itemsTb4b4b4.Te6edf3isOnlyPaperMessage Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3itemsTb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3addContactTb4b4b4(Te6edf3nameTb4b4b4, Te6edf3hashTb4b4b4, Te6edf3lxmf_address Tff7b72= Tff7b72nullTb4b4b4, Te6edf3lxst_address Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
T8b949e// Check if contact already exists
Tff7b72const Te6edf3checkResponse Tff7b72= Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3getTb4b4b4(Ta5d6ff`Ta5d6ff/api/v1/telephone/contacts/check/Tffd700${Te6edf3hashTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3checkResponseTb4b4b4.Te6edf3dataTff7b72?Tb4b4b4.Te6edf3idTb4b4b4) Tb4b4b4{
Te6edf3ToastUtilsTb4b4b4.Te6edf3infoTb4b4b4(Ta5d6ff`Tffd700${Te6edf3nameTffd700}Ta5d6ff is already in your contactsTa5d6ff`Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3postTb4b4b4(Ta5d6ff"/api/v1/telephone/contacts"Tb4b4b4, Tb4b4b4{
Te6edf3nameTff7b72: Te6edf3nameTb4b4b4,
Te6edf3remote_identity_hashTff7b72: Te6edf3hashTb4b4b4,
Te6edf3lxmf_addressTff7b72: Te6edf3lxmf_addressTb4b4b4,
Te6edf3lxst_addressTff7b72: Te6edf3lxst_addressTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3ToastUtilsTb4b4b4.Te6edf3successTb4b4b4(Ta5d6ff`Ta5d6ffAdded Tffd700${Te6edf3nameTffd700}Ta5d6ff to contactsTa5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3errorTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
Te6edf3ToastUtilsTb4b4b4.Te6edf3errorTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"messages.failed_add_contact"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3ingestPaperMessageTb4b4b4(Te6edf3uriTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3WebSocketConnectionTb4b4b4.Te6edf3sendTb4b4b4(
Tffa657JSONTb4b4b4.Te6edf3stringifyTb4b4b4(Tb4b4b4{
Te6edf3typeTff7b72: Ta5d6ff"lxm.ingest_uri"Tb4b4b4,
Te6edf3uriTff7b72: Te6edf3uriTb4b4b4,
Tb4b4b4}Tb4b4b4)
Tb4b4b4)Tb4b4b4;
Te6edf3ToastUtilsTb4b4b4.Te6edf3infoTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"messages.ingesting_paper_message"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3errorTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
Te6edf3ToastUtilsTb4b4b4.Te6edf3errorTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"messages.failed_ingest_paper"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3generatePaperMessageFromCompositionTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3canSendMessageTb4b4b4) Tff7b72returnTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3isGeneratingPaperMessage Tff7b72= Tff7b72trueTb4b4b4;
Te6edf3WebSocketConnectionTb4b4b4.Te6edf3sendTb4b4b4(
Tffa657JSONTb4b4b4.Te6edf3stringifyTb4b4b4(Tb4b4b4{
Te6edf3typeTff7b72: Ta5d6ff"lxm.generate_paper_uri"Tb4b4b4,
Te6edf3destination_hashTff7b72: Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4.Te6edf3destination_hashTb4b4b4,
Te6edf3contentTff7b72: Tff7b72thisTb4b4b4.Te6edf3newMessageTextTb4b4b4,
Tb4b4b4}Tb4b4b4)
Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3onWebsocketMessageTb4b4b4(Te6edf3messageTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3json Tff7b72= Tffa657JSONTb4b4b4.Te6edf3parseTb4b4b4(Te6edf3messageTb4b4b4.Te6edf3dataTb4b4b4)Tb4b4b4;
Tff7b72switch Tb4b4b4(Te6edf3jsonTb4b4b4.Te6edf3typeTb4b4b4) Tb4b4b4{
Tff7b72case Ta5d6ff"announce"Tff7b72: Tb4b4b4{
T8b949e// update stamp info and signal metrics if an announce is received from the selected peer
Tff7b72if Tb4b4b4(Te6edf3jsonTb4b4b4.Te6edf3announceTb4b4b4.Te6edf3destination_hash Tff7b72=== Tff7b72thisTb4b4b4.Te6edf3selectedPeerTff7b72?Tb4b4b4.Te6edf3destination_hashTb4b4b4) Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3getPeerPathTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3getPeerLxmfStampInfoTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3getPeerSignalMetricsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72case Ta5d6ff"lxmf.delivery"Tff7b72: Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3onLxmfMessageReceivedTb4b4b4(Te6edf3jsonTb4b4b4.Te6edf3lxmf_messageTb4b4b4)Tb4b4b4;
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3getPeerPathTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3getPeerSignalMetricsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72case Ta5d6ff"lxmf_message_created"Tff7b72: Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3onLxmfMessageCreatedTb4b4b4(Te6edf3jsonTb4b4b4.Te6edf3lxmf_messageTb4b4b4)Tb4b4b4;
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3getPeerPathTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72case Ta5d6ff"lxmf_message_state_updated"Tff7b72: Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3onLxmfMessageUpdatedTb4b4b4(Te6edf3jsonTb4b4b4.Te6edf3lxmf_messageTb4b4b4)Tb4b4b4;
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72case Ta5d6ff"lxmf_message_deleted"Tff7b72: Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3onLxmfMessageDeletedTb4b4b4(Te6edf3jsonTb4b4b4.Te6edf3hashTb4b4b4)Tb4b4b4;
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72case Ta5d6ff"lxm.generate_paper_uri.result"Tff7b72: Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3isGeneratingPaperMessage Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3jsonTb4b4b4.Te6edf3status Tff7b72=== Ta5d6ff"success"Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3generatedPaperMessageUri Tff7b72= Te6edf3jsonTb4b4b4.Te6edf3uriTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3isPaperMessageResultModalOpen Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3ToastUtilsTb4b4b4.Te6edf3errorTb4b4b4(Te6edf3jsonTb4b4b4.Te6edf3messageTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72case Ta5d6ff"lxm.ingest_uri.result"Tff7b72: Tb4b4b4{
T8b949e// Handled in App.vue or MessagesPage.vue
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3openLXMFAddressTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3GlobalEmitterTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"compose-new-message"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3onComposeNewMessageEventTb4b4b4(Te6edf3destinationHashTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3selectedPeer Tff7b72&& Tff7b72!Te6edf3destinationHashTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3$nextTickTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3composeInput Tff7b72= Tffa657documentTb4b4b4.Te6edf3getElementByIdTb4b4b4(Ta5d6ff"compose-input"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3composeInputTb4b4b4) Tb4b4b4{
Te6edf3composeInputTb4b4b4.Te6edf3focusTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3onComposeSubmitTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3composeAddress Tff7b72|| Tff7b72thisTb4b4b4.Te6edf3composeAddressTb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4) Tff7b72=== Ta5d6ff""Tb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72let Te6edf3destinationHash Tff7b72= Tff7b72thisTb4b4b4.Te6edf3composeAddressTb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3composeAddress Tff7b72= Ta5d6ff""Tb4b4b4;
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3handleComposeAddressTb4b4b4(Te6edf3destinationHashTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3onComposeEnterPressedTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(
Tff7b72thisTb4b4b4.Te6edf3selectedComposeSuggestionIndex Tff7b72>= T79c0ff0 Tff7b72&&
Tff7b72thisTb4b4b4.Te6edf3selectedComposeSuggestionIndex Tff7b72< Tff7b72thisTb4b4b4.Te6edf3composeSuggestionsTb4b4b4.Te6edf3length
Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3suggestion Tff7b72= Tff7b72thisTb4b4b4.Te6edf3composeSuggestionsTb4b4b4[Tff7b72thisTb4b4b4.Te6edf3selectedComposeSuggestionIndexTb4b4b4]Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3selectComposeSuggestionTb4b4b4(Te6edf3suggestionTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3onComposeSubmitTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3handleComposeInputUpTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3composeSuggestionsTb4b4b4.Te6edf3length Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3selectedComposeSuggestionIndex Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3selectedComposeSuggestionIndexTff7b72--Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3selectedComposeSuggestionIndex Tff7b72= Tff7b72thisTb4b4b4.Te6edf3composeSuggestionsTb4b4b4.Te6edf3length Tff7b72- T79c0ff1Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3handleComposeInputDownTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3composeSuggestionsTb4b4b4.Te6edf3length Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3selectedComposeSuggestionIndex Tff7b72< Tff7b72thisTb4b4b4.Te6edf3composeSuggestionsTb4b4b4.Te6edf3length Tff7b72- T79c0ff1Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3selectedComposeSuggestionIndexTff7b72++Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3selectedComposeSuggestionIndex Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3selectComposeSuggestionTb4b4b4(Te6edf3suggestionTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3composeAddress Tff7b72= Te6edf3suggestionTb4b4b4.Te6edf3hashTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3isComposeInputFocused Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3selectedComposeSuggestionIndex Tff7b72= Tff7b72-T79c0ff1Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3onComposeSubmitTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3onComposeInputBlurTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// Delay blur to allow mousedown on suggestions
Te6edf3setTimeoutTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3isComposeInputFocused Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3selectedComposeSuggestionIndex Tff7b72= Tff7b72-T79c0ff1Tb4b4b4;
Tb4b4b4}Tb4b4b4, T79c0ff200Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3handleComposeAddressTb4b4b4(Te6edf3destinationHashTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3destinationHashTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"lxmf@"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3destinationHash Tff7b72= Te6edf3destinationHashTb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff"lxmf@"Tb4b4b4, Ta5d6ff""Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3destinationHashTb4b4b4.Te6edf3length Tff7b72!== T79c0ff32Tb4b4b4) Tb4b4b4{
Te6edf3DialogUtilsTb4b4b4.Te6edf3alertTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"common.invalid_address"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3GlobalEmitterTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"compose-new-message"Tb4b4b4, Te6edf3destinationHashTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3onLxmfMessageReceivedTb4b4b4(Te6edf3lxmfMessageTb4b4b4) Tb4b4b4{
T8b949e// only add if it's for the current conversation
Tff7b72if Tb4b4b4(Te6edf3lxmfMessageTb4b4b4.Te6edf3source_hash Tff7b72!== Tff7b72thisTb4b4b4.Te6edf3selectedPeerTff7b72?Tb4b4b4.Te6edf3destination_hashTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// add inbound message to ui
Tff7b72thisTb4b4b4.Te6edf3chatItemsTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4{
Te6edf3typeTff7b72: Ta5d6ff"lxmf_message"Tb4b4b4,
Te6edf3lxmf_messageTff7b72: Te6edf3lxmfMessageTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
T8b949e// mark conversation as read
Tff7b72const Te6edf3conversation Tff7b72= Tff7b72thisTb4b4b4.Te6edf3findConversationTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4.Te6edf3destination_hashTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3conversationTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3markConversationAsReadTb4b4b4(Te6edf3conversationTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e// auto scroll to bottom if we want to
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3autoScrollOnNewMessageTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3scrollMessagesToBottomTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e// auto load audio
Tff7b72thisTb4b4b4.Te6edf3autoLoadAudioAttachmentsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3onLxmfMessageCreatedTb4b4b4(Te6edf3lxmfMessageTb4b4b4) Tb4b4b4{
T8b949e// only add if it's for the current conversation
Tff7b72if Tb4b4b4(Te6edf3lxmfMessageTb4b4b4.Te6edf3destination_hash Tff7b72!== Tff7b72thisTb4b4b4.Te6edf3selectedPeerTff7b72?Tb4b4b4.Te6edf3destination_hashTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// add new outbound lxmf message from server
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3isLxmfMessageInUiTb4b4b4(Te6edf3lxmfMessageTb4b4b4.Te6edf3hashTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3chatItemsTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4{
Te6edf3typeTff7b72: Ta5d6ff"lxmf_message"Tb4b4b4,
Te6edf3lxmf_messageTff7b72: Te6edf3lxmfMessageTb4b4b4,
Te6edf3is_outboundTff7b72: Tff7b72trueTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e// auto load audio
Tff7b72thisTb4b4b4.Te6edf3autoLoadAudioAttachmentsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3onLxmfMessageUpdatedTb4b4b4(Te6edf3lxmfMessageTb4b4b4) Tb4b4b4{
T8b949e// find existing chat item by lxmf message hash
Tff7b72const Te6edf3lxmfMessageHash Tff7b72= Te6edf3lxmfMessageTb4b4b4.Te6edf3hashTb4b4b4;
Tff7b72const Te6edf3chatItemIndex Tff7b72= Tff7b72thisTb4b4b4.Te6edf3chatItemsTb4b4b4.Te6edf3findIndexTb4b4b4(
Tb4b4b4(Te6edf3chatItemTb4b4b4) Tb4b4b4=> Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTff7b72?Tb4b4b4.Te6edf3hash Tff7b72=== Te6edf3lxmfMessageHash
Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3chatItemIndex Tff7b72=== Tff7b72-T79c0ff1Tb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// update lxmf message from server, while ensuring ui updates from nested object change
T8b949e// we merge to preserve client-side only fields or database fields not present in state updates
Tff7b72thisTb4b4b4.Te6edf3chatItemsTb4b4b4[Te6edf3chatItemIndexTb4b4b4]Tb4b4b4.Te6edf3lxmf_message Tff7b72= Tb4b4b4{
Tb4b4b4...Tff7b72thisTb4b4b4.Te6edf3chatItemsTb4b4b4[Te6edf3chatItemIndexTb4b4b4]Tb4b4b4.Te6edf3lxmf_messageTb4b4b4,
Tb4b4b4...Te6edf3lxmfMessageTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3onLxmfMessageDeletedTb4b4b4(Te6edf3hashTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3hashTb4b4b4) Tb4b4b4{
T8b949e// remove existing chat item by lxmf message hash
Tff7b72thisTb4b4b4.Te6edf3chatItems Tff7b72= Tff7b72thisTb4b4b4.Te6edf3chatItemsTb4b4b4.Te6edf3filterTb4b4b4(Tb4b4b4(Te6edf3itemTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72return Te6edf3itemTb4b4b4.Te6edf3lxmf_messageTff7b72?Tb4b4b4.Te6edf3hash Tff7b72!== Te6edf3hashTb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3getPeerPathTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
T8b949e// get path to destination
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3getTb4b4b4(
Ta5d6ff`Ta5d6ff/api/v1/destination/Tffd700${Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4.Te6edf3destination_hashTffd700}Ta5d6ff/pathTa5d6ff`
Tb4b4b4)Tb4b4b4;
T8b949e// update ui
Tff7b72thisTb4b4b4.Te6edf3selectedPeerPath Tff7b72= Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3pathTb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
T8b949e// clear previous known path
Tff7b72thisTb4b4b4.Te6edf3selectedPeerPath Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3getPeerLxmfStampInfoTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
T8b949e// get lxmf stamp info
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3getTb4b4b4(
Ta5d6ff`Ta5d6ff/api/v1/destination/Tffd700${Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4.Te6edf3destination_hashTffd700}Ta5d6ff/lxmf-stamp-infoTa5d6ff`
Tb4b4b4)Tb4b4b4;
T8b949e// update ui
Tff7b72thisTb4b4b4.Te6edf3selectedPeerLxmfStampInfo Tff7b72= Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3lxmf_stamp_infoTb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
T8b949e// clear previous stamp info
Tff7b72thisTb4b4b4.Te6edf3selectedPeerLxmfStampInfo Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3getPeerSignalMetricsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
T8b949e// get signal metrics
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3getTb4b4b4(
Ta5d6ff`Ta5d6ff/api/v1/destination/Tffd700${Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4.Te6edf3destination_hashTffd700}Ta5d6ff/signal-metricsTa5d6ff`
Tb4b4b4)Tb4b4b4;
T8b949e// update ui
Tff7b72thisTb4b4b4.Te6edf3selectedPeerSignalMetrics Tff7b72= Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3signal_metricsTb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
T8b949e// clear previous signal metrics
Tff7b72thisTb4b4b4.Te6edf3selectedPeerSignalMetrics Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3onDestinationPathClickTb4b4b4(Te6edf3pathTb4b4b4) Tb4b4b4{
Te6edf3DialogUtilsTb4b4b4.Te6edf3alertTb4b4b4(Ta5d6ff`Tffd700${Te6edf3pathTb4b4b4.Te6edf3hopsTffd700}Ta5d6ff Tffd700${Te6edf3pathTb4b4b4.Te6edf3hops Tff7b72=== T79c0ff1 Tff7b72? Ta5d6ff"hop" Tff7b72: Ta5d6ff"hops"Tffd700}Ta5d6ff away via Tffd700${Te6edf3pathTb4b4b4.Te6edf3next_hop_interfaceTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3onStampInfoClickTb4b4b4(Te6edf3stampInfoTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3stampCost Tff7b72= Te6edf3stampInfoTb4b4b4.Te6edf3stamp_costTb4b4b4;
Tff7b72const Te6edf3outboundTicketExpiry Tff7b72= Te6edf3stampInfoTb4b4b4.Te6edf3outbound_ticket_expiryTb4b4b4;
T8b949e// determine estimated time to generate a stamp
Tff7b72var Te6edf3estimatedTimeForStamp Tff7b72= Ta5d6ff""Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3stampCost Tff7b72>= T79c0ff24Tb4b4b4) Tb4b4b4{
Te6edf3estimatedTimeForStamp Tff7b72= Ta5d6ff"several hours"Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3stampCost Tff7b72>= T79c0ff20Tb4b4b4) Tb4b4b4{
Te6edf3estimatedTimeForStamp Tff7b72= Ta5d6ff"more than an hour"Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3stampCost Tff7b72>= T79c0ff18Tb4b4b4) Tb4b4b4{
Te6edf3estimatedTimeForStamp Tff7b72= Ta5d6ff"~5 minutes"Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3stampCost Tff7b72>= T79c0ff17Tb4b4b4) Tb4b4b4{
Te6edf3estimatedTimeForStamp Tff7b72= Ta5d6ff"a few minutes"Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3stampCost Tff7b72>= T79c0ff16Tb4b4b4) Tb4b4b4{
Te6edf3estimatedTimeForStamp Tff7b72= Ta5d6ff"~1 minute"Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3stampCost Tff7b72>= T79c0ff13Tb4b4b4) Tb4b4b4{
Te6edf3estimatedTimeForStamp Tff7b72= Ta5d6ff"~30 seconds"Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3stampCost Tff7b72>= T79c0ff9Tb4b4b4) Tb4b4b4{
Te6edf3estimatedTimeForStamp Tff7b72= Ta5d6ff"~10 seconds"Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3stampCost Tff7b72>= T79c0ff1Tb4b4b4) Tb4b4b4{
Te6edf3estimatedTimeForStamp Tff7b72= Ta5d6ff"a few seconds"Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3estimatedTimeForStamp Tff7b72= Ta5d6ff"0 seconds"Tb4b4b4;
Tb4b4b4}
T8b949e// check if we have an outbound ticket available
Tff7b72if Tb4b4b4(Te6edf3outboundTicketExpiry Tff7b72!= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3estimatedTimeForStamp Tff7b72= Ta5d6ff`Ta5d6ffinstant (ticket expires Tffd700${Te6edf3dayjsTb4b4b4(Te6edf3outboundTicketExpiry Tff7b72* T79c0ff1000Tb4b4b4)Tb4b4b4.Te6edf3fromNowTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff)Ta5d6ff`Tb4b4b4;
Tb4b4b4}
Te6edf3DialogUtilsTb4b4b4.Te6edf3alertTb4b4b4(
Ta5d6ff`Ta5d6ffThis peer has enabled stamp security.Ta5d6ff\nTa5d6ff\nTa5d6ffYour device must have a ticket, or solve an automated proof of work task each time you send them a message.Ta5d6ff\nTa5d6ff\nTa5d6ffTime per message: Tffd700${Te6edf3estimatedTimeForStampTffd700}Ta5d6ff`
Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3onSignalMetricsClickTb4b4b4(Te6edf3signalMetricsTb4b4b4) Tb4b4b4{
Te6edf3DialogUtilsTb4b4b4.Te6edf3alertTb4b4b4(
Tb4b4b4[
Ta5d6ff`Ta5d6ffSignal Quality: Tffd700${Te6edf3signalMetricsTb4b4b4.Te6edf3quality Tff7b72?? Ta5d6ff"???"Tffd700}Ta5d6ff%Ta5d6ff`Tb4b4b4,
Ta5d6ff`Ta5d6ffRSSI: Tffd700${Te6edf3signalMetricsTb4b4b4.Te6edf3rssi Tff7b72?? Ta5d6ff"???"Tffd700}Ta5d6ffdBmTa5d6ff`Tb4b4b4,
Ta5d6ff`Ta5d6ffSNR: Tffd700${Te6edf3signalMetricsTb4b4b4.Te6edf3snr Tff7b72?? Ta5d6ff"???"Tffd700}Ta5d6ffdBTa5d6ff`Tb4b4b4,
Tb4b4b4]Tb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff"\n"Tb4b4b4)
Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3scrollMessagesToBottomTff7b72: Tff7b72function Tb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// next tick waits for the ui to have the new elements added
Tff7b72thisTb4b4b4.Te6edf3$nextTickTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
T8b949e// set timeout with zero millis seems to fix issue where it doesn't scroll all the way to the bottom...
Te6edf3setTimeoutTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3container Tff7b72= Tffa657documentTb4b4b4.Te6edf3getElementByIdTb4b4b4(Ta5d6ff"messages"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3containerTb4b4b4) Tb4b4b4{
Te6edf3containerTb4b4b4.Te6edf3scrollTop Tff7b72= Te6edf3containerTb4b4b4.Te6edf3scrollHeightTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3isLxmfMessageInUiTff7b72: Tff7b72function Tb4b4b4(Te6edf3hashTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3chatItemsTb4b4b4.Te6edf3findIndexTb4b4b4(Tb4b4b4(Te6edf3chatItemTb4b4b4) Tb4b4b4=> Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTff7b72?Tb4b4b4.Te6edf3hash Tff7b72=== Te6edf3hashTb4b4b4) Tff7b72!== Tff7b72-T79c0ff1Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3getCustomDisplayNameTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
T8b949e// get custom display name
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3getTb4b4b4(
Ta5d6ff`Ta5d6ff/api/v1/destination/Tffd700${Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4.Te6edf3destination_hashTffd700}Ta5d6ff/custom-display-nameTa5d6ff`
Tb4b4b4)Tb4b4b4;
T8b949e// update ui
Tff7b72thisTb4b4b4.Te6edf3$emitTb4b4b4(Ta5d6ff"update:selectedPeer"Tb4b4b4, Tb4b4b4{
Tb4b4b4...Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4,
Te6edf3custom_display_nameTff7b72: Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3custom_display_nameTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3errorTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3errorTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3updateCustomDisplayNameTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// do nothing if no peer selected
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// ask user for new display name
Tff7b72const Te6edf3displayName Tff7b72= Tff7b72await Te6edf3DialogUtilsTb4b4b4.Te6edf3promptTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"messages.enter_display_name"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3displayName Tff7b72== Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72try Tb4b4b4{
T8b949e// update display name on server
Tff7b72await Te6edf3axiosTb4b4b4.Te6edf3postTb4b4b4(
Ta5d6ff`Ta5d6ff/api/v1/destination/Tffd700${Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4.Te6edf3destination_hashTffd700}Ta5d6ff/custom-display-name/updateTa5d6ff`Tb4b4b4,
Tb4b4b4{
Te6edf3display_nameTff7b72: Te6edf3displayNameTb4b4b4,
Tb4b4b4}
Tb4b4b4)Tb4b4b4;
T8b949e// update display name in ui
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3getCustomDisplayNameTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// reload conversations (so conversations list updates name)
Tff7b72thisTb4b4b4.Te6edf3$emitTb4b4b4(Ta5d6ff"reload-conversations"Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3errorTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3errorTb4b4b4)Tb4b4b4;
Te6edf3DialogUtilsTb4b4b4.Te6edf3alertTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"messages.failed_update_display_name"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3onConversationDeletedTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// reload conversation
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3initialLoadTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// reload conversations
Tff7b72thisTb4b4b4.Te6edf3$emitTb4b4b4(Ta5d6ff"reload-conversations"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3onChatItemClickTff7b72: Tff7b72function Tb4b4b4(Te6edf3chatItemTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3chatItemTb4b4b4.Te6edf3is_actions_expandedTb4b4b4) Tb4b4b4{
Te6edf3chatItemTb4b4b4.Te6edf3is_actions_expanded Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3chatItemTb4b4b4.Te6edf3is_actions_expanded Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3replyToMessageTb4b4b4(Te6edf3chatItemTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3replyingTo Tff7b72= Te6edf3chatItemTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3messageContextMenuTb4b4b4.Te6edf3show Tff7b72= Tff7b72falseTb4b4b4;
Te6edf3chatItemTb4b4b4.Te6edf3is_actions_expanded Tff7b72= Tff7b72falseTb4b4b4;
T8b949e// focus the input
Tff7b72thisTb4b4b4.Te6edf3$nextTickTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3textarea Tff7b72= Tff7b72thisTb4b4b4.Te6edf3$refsTb4b4b4[Ta5d6ff"message-input"Tb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3textareaTb4b4b4) Tb4b4b4{
Te6edf3textareaTb4b4b4.Te6edf3focusTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3cancelReplyTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3replyingTo Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3scrollToMessageTb4b4b4(Te6edf3hashTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3index Tff7b72= Tff7b72thisTb4b4b4.Te6edf3chatItemsTb4b4b4.Te6edf3findIndexTb4b4b4(Tb4b4b4(Te6edf3itemTb4b4b4) Tb4b4b4=> Te6edf3itemTb4b4b4.Te6edf3lxmf_messageTff7b72?Tb4b4b4.Te6edf3hash Tff7b72=== Te6edf3hashTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3index Tff7b72!== Tff7b72-T79c0ff1Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3el Tff7b72= Tffa657documentTb4b4b4.Te6edf3getElementByIdTb4b4b4(Ta5d6ff`Ta5d6ffmessage-Tffd700${Te6edf3hashTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3elTb4b4b4) Tb4b4b4{
Te6edf3elTb4b4b4.Te6edf3scrollIntoViewTb4b4b4(Tb4b4b4{ Te6edf3behaviorTff7b72: Ta5d6ff"smooth"Tb4b4b4, Te6edf3blockTff7b72: Ta5d6ff"center" Tb4b4b4}Tb4b4b4)Tb4b4b4;
T8b949e// briefly highlight
Te6edf3elTb4b4b4.Te6edf3classListTb4b4b4.Te6edf3addTb4b4b4(Ta5d6ff"ring-2"Tb4b4b4, Ta5d6ff"ring-blue-500"Tb4b4b4, Ta5d6ff"ring-offset-2"Tb4b4b4)Tb4b4b4;
Te6edf3setTimeoutTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3elTb4b4b4.Te6edf3classListTb4b4b4.Te6edf3removeTb4b4b4(Ta5d6ff"ring-2"Tb4b4b4, Ta5d6ff"ring-blue-500"Tb4b4b4, Ta5d6ff"ring-offset-2"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4, T79c0ff2000Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3DialogUtilsTb4b4b4.Te6edf3alertTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"messages.message_not_found_in_cache"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3getRepliedMessageTb4b4b4(Te6edf3hashTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3item Tff7b72= Tff7b72thisTb4b4b4.Te6edf3chatItemsTb4b4b4.Te6edf3findTb4b4b4(Tb4b4b4(Te6edf3iTb4b4b4) Tb4b4b4=> Te6edf3iTb4b4b4.Te6edf3lxmf_messageTff7b72?Tb4b4b4.Te6edf3hash Tff7b72=== Te6edf3hashTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3item Tff7b72? Te6edf3itemTb4b4b4.Te6edf3lxmf_message Tff7b72: Tff7b72nullTb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3onMessageContextMenuTb4b4b4(Te6edf3eventTb4b4b4, Te6edf3chatItemTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3messageContextMenuTb4b4b4.Te6edf3chatItem Tff7b72= Te6edf3chatItemTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3messageContextMenuTb4b4b4.Te6edf3show Tff7b72= Tff7b72trueTb4b4b4;
T8b949e// wait for context menu to be rendered to calculate its width/height
Tff7b72thisTb4b4b4.Te6edf3$nextTickTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3menuWidth Tff7b72= T79c0ff180Tb4b4b4; T8b949e// approximate minimum width
Tff7b72const Te6edf3menuHeight Tff7b72= T79c0ff150Tb4b4b4; T8b949e// approximate height
Tff7b72let Te6edf3x Tff7b72= Te6edf3eventTb4b4b4.Te6edf3clientXTb4b4b4;
Tff7b72let Te6edf3y Tff7b72= Te6edf3eventTb4b4b4.Te6edf3clientYTb4b4b4;
T8b949e// Adjust X if it would go off-screen on the right
Tff7b72if Tb4b4b4(Te6edf3x Tff7b72+ Te6edf3menuWidth Tff7b72> Tffa657windowTb4b4b4.Te6edf3innerWidthTb4b4b4) Tb4b4b4{
Te6edf3x Tff7b72= Tffa657windowTb4b4b4.Te6edf3innerWidth Tff7b72- Te6edf3menuWidth Tff7b72- T79c0ff10Tb4b4b4;
Tb4b4b4}
T8b949e// Adjust Y if it would go off-screen at the bottom
Tff7b72if Tb4b4b4(Te6edf3y Tff7b72+ Te6edf3menuHeight Tff7b72> Tffa657windowTb4b4b4.Te6edf3innerHeightTb4b4b4) Tb4b4b4{
Te6edf3y Tff7b72= Tffa657windowTb4b4b4.Te6edf3innerHeight Tff7b72- Te6edf3menuHeight Tff7b72- T79c0ff10Tb4b4b4;
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3messageContextMenuTb4b4b4.Te6edf3x Tff7b72= Te6edf3xTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3messageContextMenuTb4b4b4.Te6edf3y Tff7b72= Te6edf3yTb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3showRawMessageTb4b4b4(Te6edf3chatItemTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
T8b949e// we'll try to get the URI first as it contains the raw signed message
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3getTb4b4b4(Ta5d6ff`Ta5d6ff/api/v1/lxmf-messages/Tffd700${Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hashTffd700}Ta5d6ff/uriTa5d6ff`Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3rawMessageData Tff7b72= Tb4b4b4{
Tb4b4b4...Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4,
Te6edf3raw_uriTff7b72: Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3uriTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// if URI is not available (message no longer in router), we show what we have
Tff7b72thisTb4b4b4.Te6edf3rawMessageData Tff7b72= Tb4b4b4{ Tb4b4b4...Te6edf3chatItemTb4b4b4.Te6edf3lxmf_message Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3isRawMessageModalOpen Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3downloadAndDecodeAudioTb4b4b4(Te6edf3chatItemTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3isDownloadingAudioTb4b4b4[Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hashTb4b4b4]Tb4b4b4) Tff7b72returnTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3isDownloadingAudioTb4b4b4[Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hashTb4b4b4] Tff7b72= Tff7b72trueTb4b4b4;
Tff7b72try Tb4b4b4{
T8b949e// fetch audio bytes from api
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3getTb4b4b4(
Ta5d6ff`Ta5d6ff/api/v1/lxmf-messages/attachment/Tffd700${Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hashTffd700}Ta5d6ff/audioTa5d6ff`Tb4b4b4,
Tb4b4b4{
Te6edf3responseTypeTff7b72: Ta5d6ff"arraybuffer"Tb4b4b4,
Tb4b4b4}
Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3audioBytes Tff7b72= Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4; T8b949e// this will be an ArrayBuffer
T8b949e// ensure we have the bytes
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3audioBytesTb4b4b4) Tb4b4b4{
Tff7b72throw Tff7b72new Tf85149ErrorTb4b4b4(Ta5d6ff"No audio bytes received"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e// decode audio to blob url
T8b949e// note: decodeLxmfAudioFieldToBlobUrl expects a field object with audio_mode and audio_bytes
Tff7b72const Te6edf3audioField Tff7b72= Tb4b4b4{
Te6edf3audio_modeTff7b72: Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3audioTb4b4b4.Te6edf3audio_modeTb4b4b4,
Te6edf3audio_bytesTff7b72: Te6edf3audioBytesTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tff7b72const Te6edf3objectUrl Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3decodeLxmfAudioFieldToBlobUrlTb4b4b4(Te6edf3audioFieldTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3objectUrlTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3lxmfMessageAudioAttachmentCacheTb4b4b4[Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hashTb4b4b4] Tff7b72= Te6edf3objectUrlTb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3errorTb4b4b4(Ta5d6ff"Failed to download or decode audio:"Tb4b4b4, Te6edf3eTb4b4b4)Tb4b4b4;
Te6edf3DialogUtilsTb4b4b4.Te6edf3alertTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"messages.failed_load_audio"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72finally Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3isDownloadingAudioTb4b4b4[Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hashTb4b4b4] Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3autoLoadAudioAttachmentsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3chatItem Tff7b72of Tff7b72thisTb4b4b4.Te6edf3chatItemsTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(
Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTff7b72?Tb4b4b4.Te6edf3audio Tff7b72&&
Tff7b72!Tff7b72thisTb4b4b4.Te6edf3lxmfMessageAudioAttachmentCacheTb4b4b4[Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hashTb4b4b4] Tff7b72&&
Tff7b72!Tff7b72thisTb4b4b4.Te6edf3isDownloadingAudioTb4b4b4[Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hashTb4b4b4]
Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3downloadAndDecodeAudioTb4b4b4(Te6edf3chatItemTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3formatAttachmentSizeTb4b4b4(Te6edf3attachmentTb4b4b4, Te6edf3typeTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3attachmentTb4b4b4[Ta5d6ff`Tffd700${Te6edf3typeTffd700}Ta5d6ff_sizeTa5d6ff`Tb4b4b4] Tff7b72!== Tff7b72undefined Tff7b72&& Te6edf3attachmentTb4b4b4[Ta5d6ff`Tffd700${Te6edf3typeTffd700}Ta5d6ff_sizeTa5d6ff`Tb4b4b4] Tff7b72!== Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3formatBytesTb4b4b4(Te6edf3attachmentTb4b4b4[Ta5d6ff`Tffd700${Te6edf3typeTffd700}Ta5d6ff_sizeTa5d6ff`Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3attachmentTb4b4b4[Ta5d6ff`Tffd700${Te6edf3typeTffd700}Ta5d6ff_bytesTa5d6ff`Tb4b4b4]Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3formatBase64BytesTb4b4b4(Te6edf3attachmentTb4b4b4[Ta5d6ff`Tffd700${Te6edf3typeTffd700}Ta5d6ff_bytesTa5d6ff`Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Ta5d6ff"0 B"Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3openImageTff7b72: Tff7b72async Tff7b72function Tb4b4b4(Te6edf3urlTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3imageModalUrl Tff7b72= Te6edf3urlTb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3closeImageModalTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3imageModalUrl Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3downloadFileFromBase64Tff7b72: Tff7b72async Tff7b72function Tb4b4b4(Te6edf3fileNameTb4b4b4, Te6edf3fileBytesBase64Tb4b4b4) Tb4b4b4{
T8b949e// create blob from base64 encoded file bytes
Tff7b72const Te6edf3byteCharacters Tff7b72= Te6edf3atobTb4b4b4(Te6edf3fileBytesBase64Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3byteNumbers Tff7b72= Tff7b72new Tffa657ArrayTb4b4b4(Te6edf3byteCharactersTb4b4b4.Te6edf3lengthTb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3byteCharactersTb4b4b4.Te6edf3lengthTb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Te6edf3byteNumbersTb4b4b4[Te6edf3iTb4b4b4] Tff7b72= Te6edf3byteCharactersTb4b4b4.Te6edf3charCodeAtTb4b4b4(Te6edf3iTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3byteArray Tff7b72= Tff7b72new Tffa657Uint8ArrayTb4b4b4(Te6edf3byteNumbersTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3blob Tff7b72= Tff7b72new Te6edf3BlobTb4b4b4(Tb4b4b4[Te6edf3byteArrayTb4b4b4]Tb4b4b4)Tb4b4b4;
T8b949e// create object url for blob
Tff7b72const Te6edf3objectUrl Tff7b72= Te6edf3URLTb4b4b4.Te6edf3createObjectURLTb4b4b4(Te6edf3blobTb4b4b4)Tb4b4b4;
T8b949e// create link element to download blob
Tff7b72const Te6edf3link Tff7b72= Tffa657documentTb4b4b4.Te6edf3createElementTb4b4b4(Ta5d6ff"a"Tb4b4b4)Tb4b4b4;
Te6edf3linkTb4b4b4.Te6edf3href Tff7b72= Te6edf3objectUrlTb4b4b4;
Te6edf3linkTb4b4b4.Te6edf3download Tff7b72= Te6edf3fileNameTb4b4b4;
Te6edf3linkTb4b4b4.Te6edf3styleTb4b4b4.Te6edf3display Tff7b72= Ta5d6ff"none"Tb4b4b4;
Tffa657documentTb4b4b4.Te6edf3bodyTb4b4b4.Te6edf3appendTb4b4b4(Te6edf3linkTb4b4b4)Tb4b4b4;
T8b949e// click link to download file in browser
Te6edf3linkTb4b4b4.Te6edf3clickTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// link element is no longer needed
Te6edf3linkTb4b4b4.Te6edf3removeTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// revoke object url to clear memory
Te6edf3setTimeoutTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3URLTb4b4b4.Te6edf3revokeObjectURLTb4b4b4(Te6edf3objectUrlTb4b4b4)Tb4b4b4, T79c0ff10000Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3processAudioForSelectedPeerChatItemsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3chatItem Tff7b72of Tff7b72thisTb4b4b4.Te6edf3selectedPeerChatItemsTb4b4b4) Tb4b4b4{
T8b949e// skip if no audio, or if audio bytes are missing (must be downloaded manually)
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTff7b72?Tb4b4b4.Te6edf3fieldsTff7b72?Tb4b4b4.Te6edf3audio Tff7b72|| Tff7b72!Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3audioTb4b4b4.Te6edf3audio_bytesTb4b4b4) Tb4b4b4{
Tff7b72continueTb4b4b4;
Tb4b4b4}
T8b949e// skip if audio already cached
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3lxmfMessageAudioAttachmentCacheTb4b4b4[Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hashTb4b4b4]Tb4b4b4) Tb4b4b4{
Tff7b72continueTb4b4b4;
Tb4b4b4}
T8b949e// decode audio to blob url
Tff7b72const Te6edf3objectUrl Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3decodeLxmfAudioFieldToBlobUrlTb4b4b4(Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3audioTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3objectUrlTb4b4b4) Tb4b4b4{
Tff7b72continueTb4b4b4;
Tb4b4b4}
T8b949e// update audio cache
Tff7b72thisTb4b4b4.Te6edf3lxmfMessageAudioAttachmentCacheTb4b4b4[Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hashTb4b4b4] Tff7b72= Te6edf3objectUrlTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3decodeLxmfAudioFieldToBlobUrlTb4b4b4(Te6edf3audioFieldTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
T8b949e// get audio mode and audio bytes from audio field
Tff7b72const Te6edf3audioMode Tff7b72= Te6edf3audioFieldTb4b4b4.Te6edf3audio_modeTb4b4b4;
Tff7b72const Te6edf3audioBytes Tff7b72= Te6edf3audioFieldTb4b4b4.Te6edf3audio_bytesTb4b4b4;
T8b949e// handle opus: AM_OPUS_OGG
Tff7b72if Tb4b4b4(Te6edf3audioMode Tff7b72=== T79c0ff0x10Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3decodeOpusAudioToBlobUrlTb4b4b4(Te6edf3audioFieldTb4b4b4.Te6edf3audio_bytesTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e// determine codec2 mode, or skip if unknown
Tff7b72const Te6edf3codecMode Tff7b72= Tff7b72thisTb4b4b4.Te6edf3lxmfAudioModeToCodec2ModeMapTb4b4b4[Te6edf3audioModeTb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3codecModeTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"unsupported audio mode: " Tff7b72+ Te6edf3audioModeTb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
T8b949e// convert to uint8 array
Tff7b72let Te6edf3encodedTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3audioBytes Tff7b72=== Ta5d6ff"string"Tb4b4b4) Tb4b4b4{
Te6edf3encoded Tff7b72= Tff7b72thisTb4b4b4.Te6edf3base64ToArrayBufferTb4b4b4(Te6edf3audioBytesTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3encoded Tff7b72= Tff7b72new Tffa657Uint8ArrayTb4b4b4(Te6edf3audioBytesTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e// decode codec2 audio
Tff7b72const Te6edf3decoded Tff7b72= Tff7b72await Te6edf3Codec2LibTb4b4b4.Te6edf3runDecodeTb4b4b4(Te6edf3codecModeTb4b4b4, Te6edf3encodedTb4b4b4)Tb4b4b4;
T8b949e// convert decoded codec2 to wav audio
Tff7b72const Te6edf3wavAudio Tff7b72= Tff7b72await Te6edf3Codec2LibTb4b4b4.Te6edf3rawToWavTb4b4b4(Te6edf3decodedTb4b4b4)Tb4b4b4;
T8b949e// create blob from wav audio
Tff7b72const Te6edf3blob Tff7b72= Tff7b72new Te6edf3BlobTb4b4b4(Tb4b4b4[Te6edf3wavAudioTb4b4b4]Tb4b4b4, Tb4b4b4{
Te6edf3typeTff7b72: Ta5d6ff"audio/wav"Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
T8b949e// create object url for blob
Tff7b72return Te6edf3URLTb4b4b4.Te6edf3createObjectURLTb4b4b4(Te6edf3blobTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
T8b949e// failed to decode lxmf audio field
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3decodeOpusAudioToBlobUrlTb4b4b4(Te6edf3audioBytesTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
T8b949e// convert to uint8 array
Tff7b72let Te6edf3opusAudioBytesTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3audioBytes Tff7b72=== Ta5d6ff"string"Tb4b4b4) Tb4b4b4{
Te6edf3opusAudioBytes Tff7b72= Tff7b72thisTb4b4b4.Te6edf3base64ToArrayBufferTb4b4b4(Te6edf3audioBytesTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3opusAudioBytes Tff7b72= Tff7b72new Tffa657Uint8ArrayTb4b4b4(Te6edf3audioBytesTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e// create blob from opus audio
Tff7b72const Te6edf3blob Tff7b72= Tff7b72new Te6edf3BlobTb4b4b4(Tb4b4b4[Te6edf3opusAudioBytesTb4b4b4]Tb4b4b4, Tb4b4b4{
Te6edf3typeTff7b72: Ta5d6ff"audio/opus"Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
T8b949e// create object url for blob
Tff7b72return Te6edf3URLTb4b4b4.Te6edf3createObjectURLTb4b4b4(Te6edf3blobTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
T8b949e// failed to decode opus audio
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3base64ToArrayBufferTff7b72: Tff7b72function Tb4b4b4(Te6edf3base64Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657Uint8ArrayTb4b4b4.Tff7b72fromTb4b4b4(Te6edf3atobTb4b4b4(Te6edf3base64Tb4b4b4)Tb4b4b4, Tb4b4b4(Te6edf3cTb4b4b4) Tb4b4b4=> Te6edf3cTb4b4b4.Te6edf3charCodeAtTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3deleteChatItemTb4b4b4(Te6edf3chatItemTb4b4b4, Te6edf3shouldConfirm Tff7b72= Tff7b72trueTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
T8b949e// ask user to confirm deleting message
Tff7b72if Tb4b4b4(
Te6edf3shouldConfirm Tff7b72&&
Tff7b72!Tb4b4b4(Tff7b72await Te6edf3DialogUtilsTb4b4b4.Te6edf3confirmTb4b4b4(
Ta5d6ff"Are you sure you want to delete this message? This can not be undone!"
Tb4b4b4)Tb4b4b4)
Tb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// make sure it's an lxmf message
Tff7b72if Tb4b4b4(Te6edf3chatItemTb4b4b4.Te6edf3type Tff7b72!== Ta5d6ff"lxmf_message"Tb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// delete lxmf message from server
Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Tff7b72deleteTb4b4b4(Ta5d6ff`Ta5d6ff/api/v1/lxmf-messages/Tffd700${Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hashTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
T8b949e// remove lxmf message from chat items using hash, as other pending items might not have an id yet
Tff7b72thisTb4b4b4.Te6edf3chatItems Tff7b72= Tff7b72thisTb4b4b4.Te6edf3chatItemsTb4b4b4.Te6edf3filterTb4b4b4(Tb4b4b4(Te6edf3itemTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72return Te6edf3itemTb4b4b4.Te6edf3lxmf_messageTff7b72?Tb4b4b4.Te6edf3hash Tff7b72!== Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hashTb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// do nothing if failed to delete message
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3openShareContactModalTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3getTb4b4b4(Ta5d6ff"/api/v1/telephone/contacts"Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3contacts Tff7b72= Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3contactsTb4b4b4.Te6edf3length Tff7b72=== T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3ToastUtilsTb4b4b4.Te6edf3infoTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"messages.no_contacts_telephone"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3isShareContactModalOpen Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3errorTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
Te6edf3ToastUtilsTb4b4b4.Te6edf3errorTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"messages.failed_load_contacts"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3shareContactTb4b4b4(Te6edf3contactTb4b4b4) Tb4b4b4{
Tff7b72let Te6edf3sharedString Tff7b72= Ta5d6ff`Ta5d6ffContact: Tffd700${Te6edf3contactTb4b4b4.Te6edf3nameTffd700}Ta5d6ff <Tffd700${Te6edf3contactTb4b4b4.Te6edf3remote_identity_hashTffd700}Ta5d6ff>Ta5d6ff`Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3contactTb4b4b4.Te6edf3lxmf_addressTb4b4b4) Te6edf3sharedString Tff7b72+= Ta5d6ff`Ta5d6ff [LXMF: Tffd700${Te6edf3contactTb4b4b4.Te6edf3lxmf_addressTffd700}Ta5d6ff]Ta5d6ff`Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3contactTb4b4b4.Te6edf3lxst_addressTb4b4b4) Te6edf3sharedString Tff7b72+= Ta5d6ff`Ta5d6ff [LXST: Tffd700${Te6edf3contactTb4b4b4.Te6edf3lxst_addressTffd700}Ta5d6ff]Ta5d6ff`Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3newMessageText Tff7b72= Te6edf3sharedStringTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3isShareContactModalOpen Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3sendMessageTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3shareAsPaperMessageTb4b4b4(Te6edf3chatItemTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3paperMessageHash Tff7b72= Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hashTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3isPaperMessageModalOpen Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3sendMessageTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// do nothing if can't send message
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3canSendMessageTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// do nothing if no peer selected
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3isSendingMessage Tff7b72= Tff7b72trueTb4b4b4;
Tff7b72try Tb4b4b4{
T8b949e// build fields
Tff7b72const Te6edf3fields Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4;
T8b949e// add telemetry if present
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3newMessageTelemetryTb4b4b4) Tb4b4b4{
Te6edf3fieldsTb4b4b4[Ta5d6ff"telemetry"Tb4b4b4] Tff7b72= Tff7b72thisTb4b4b4.Te6edf3newMessageTelemetryTb4b4b4;
Tb4b4b4}
T8b949e// add file attachments
Tff7b72var Te6edf3fileAttachmentsTotalSize Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3newMessageFilesTb4b4b4.Te6edf3length Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3fileAttachments Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3file Tff7b72of Tff7b72thisTb4b4b4.Te6edf3newMessageFilesTb4b4b4) Tb4b4b4{
Te6edf3fileAttachmentsTotalSize Tff7b72+= Te6edf3fileTb4b4b4.Te6edf3sizeTb4b4b4;
Te6edf3fileAttachmentsTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4{
Te6edf3file_nameTff7b72: Te6edf3fileTb4b4b4.Te6edf3nameTb4b4b4,
Te6edf3file_sizeTff7b72: Te6edf3fileTb4b4b4.Te6edf3sizeTb4b4b4,
Te6edf3file_bytesTff7b72: Te6edf3UtilsTb4b4b4.Te6edf3arrayBufferToBase64Tb4b4b4(Tff7b72await Te6edf3fileTb4b4b4.Te6edf3arrayBufferTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3fieldsTb4b4b4[Ta5d6ff"file_attachments"Tb4b4b4] Tff7b72= Te6edf3fileAttachmentsTb4b4b4;
Tb4b4b4}
T8b949e// add image attachment
Tff7b72var Te6edf3imageTotalSize Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72var Te6edf3images Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3newMessageImagesTb4b4b4.Te6edf3length Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3image Tff7b72of Tff7b72thisTb4b4b4.Te6edf3newMessageImagesTb4b4b4) Tb4b4b4{
Te6edf3imageTotalSize Tff7b72+= Te6edf3imageTb4b4b4.Te6edf3sizeTb4b4b4;
Te6edf3imagesTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4{
Te6edf3image_typeTff7b72: Te6edf3imageTb4b4b4.Te6edf3typeTb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff"image/"Tb4b4b4, Ta5d6ff""Tb4b4b4)Tb4b4b4,
Te6edf3image_sizeTff7b72: Te6edf3imageTb4b4b4.Te6edf3sizeTb4b4b4,
Te6edf3image_bytesTff7b72: Te6edf3UtilsTb4b4b4.Te6edf3arrayBufferToBase64Tb4b4b4(Tff7b72await Te6edf3imageTb4b4b4.Te6edf3arrayBufferTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3nameTff7b72: Te6edf3imageTb4b4b4.Te6edf3nameTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
T8b949e// add audio attachment
Tff7b72var Te6edf3audioTotalSize Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3newMessageAudioTb4b4b4) Tb4b4b4{
Te6edf3audioTotalSize Tff7b72= Tff7b72thisTb4b4b4.Te6edf3newMessageAudioTb4b4b4.Te6edf3sizeTb4b4b4;
Te6edf3fieldsTb4b4b4[Ta5d6ff"audio"Tb4b4b4] Tff7b72= Tb4b4b4{
Te6edf3audio_modeTff7b72: Tff7b72thisTb4b4b4.Te6edf3newMessageAudioTb4b4b4.Te6edf3audio_modeTb4b4b4,
Te6edf3audio_sizeTff7b72: Tff7b72thisTb4b4b4.Te6edf3newMessageAudioTb4b4b4.Te6edf3sizeTb4b4b4,
Te6edf3audio_bytesTff7b72: Te6edf3UtilsTb4b4b4.Te6edf3arrayBufferToBase64Tb4b4b4(Tff7b72await Tff7b72thisTb4b4b4.Te6edf3newMessageAudioTb4b4b4.Te6edf3audio_blobTb4b4b4.Te6edf3arrayBufferTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}
T8b949e// calculate estimated message size in bytes
Tff7b72const Te6edf3contentSize Tff7b72= Tff7b72thisTb4b4b4.Te6edf3newMessageTextTb4b4b4.Te6edf3lengthTb4b4b4;
Tff7b72const Te6edf3totalMessageSize Tff7b72= Te6edf3contentSize Tff7b72+ Te6edf3fileAttachmentsTotalSize Tff7b72+ Te6edf3imageTotalSize Tff7b72+ Te6edf3audioTotalSizeTb4b4b4;
T8b949e// ask user if they still want to send message if it may be rejected by sender
Tff7b72if Tb4b4b4(Te6edf3totalMessageSize Tff7b72> T79c0ff1000 Tff7b72* T79c0ff900Tb4b4b4) Tb4b4b4{
T8b949e// actual limit in LXMF Router is 1mb
Tff7b72if Tb4b4b4(
Tff7b72!Tb4b4b4(Tff7b72await Te6edf3DialogUtilsTb4b4b4.Te6edf3confirmTb4b4b4(
Ta5d6ff`Ta5d6ffYour message exceeds 900KB (It's Tffd700${Tff7b72thisTb4b4b4.Te6edf3formatBytesTb4b4b4(Te6edf3totalMessageSizeTb4b4b4)Tffd700}Ta5d6ff). It may be rejected by the recipient unless they have increased their delivery limit. Do you want to try sending anyway?Ta5d6ff`
Tb4b4b4)Tb4b4b4)
Tb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tb4b4b4}
T8b949e// if no images, send message as usual
Tff7b72if Tb4b4b4(Te6edf3imagesTb4b4b4.Te6edf3length Tff7b72=== T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3repliedContent Tff7b72=
Tff7b72thisTb4b4b4.Te6edf3replyingTo Tff7b72&& Tff7b72thisTb4b4b4.Te6edf3getRepliedMessageTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3replyingToTb4b4b4.Te6edf3lxmf_messageTff7b72?Tb4b4b4.Te6edf3hashTb4b4b4)Tff7b72?Tb4b4b4.Te6edf3contentTb4b4b4;
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3postTb4b4b4(Ta5d6ff`Ta5d6ff/api/v1/lxmf-messages/sendTa5d6ff`Tb4b4b4, Tb4b4b4{
Te6edf3delivery_methodTff7b72: Tff7b72thisTb4b4b4.Te6edf3newMessageDeliveryMethodTb4b4b4,
Te6edf3lxmf_messageTff7b72: Tb4b4b4{
Te6edf3destination_hashTff7b72: Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4.Te6edf3destination_hashTb4b4b4,
Te6edf3contentTff7b72: Tff7b72thisTb4b4b4.Te6edf3newMessageTextTb4b4b4,
Te6edf3reply_to_hashTff7b72: Tff7b72thisTb4b4b4.Te6edf3replyingToTff7b72?Tb4b4b4.Te6edf3lxmf_messageTff7b72?Tb4b4b4.Te6edf3hash Tff7b72|| Tff7b72nullTb4b4b4,
Te6edf3reply_quoted_contentTff7b72: Te6edf3repliedContent Tff7b72|| Tff7b72nullTb4b4b4,
Te6edf3fieldsTff7b72: Te6edf3fieldsTb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
T8b949e// add outbound message to ui
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3isLxmfMessageInUiTb4b4b4(Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hashTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3chatItemsTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4{
Te6edf3typeTff7b72: Ta5d6ff"lxmf_message"Tb4b4b4,
Te6edf3lxmf_messageTff7b72: Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3lxmf_messageTb4b4b4,
Te6edf3is_outboundTff7b72: Tff7b72trueTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// send first image with message text and other fields
Tff7b72const Te6edf3firstImage Tff7b72= Te6edf3imagesTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3firstFields Tff7b72= Tb4b4b4{
Tb4b4b4...Te6edf3fieldsTb4b4b4,
Te6edf3imageTff7b72: Tb4b4b4{ Te6edf3image_typeTff7b72: Te6edf3firstImageTb4b4b4.Te6edf3image_typeTb4b4b4, Te6edf3image_bytesTff7b72: Te6edf3firstImageTb4b4b4.Te6edf3image_bytes Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tff7b72const Te6edf3repliedContent Tff7b72=
Tff7b72thisTb4b4b4.Te6edf3replyingTo Tff7b72&& Tff7b72thisTb4b4b4.Te6edf3getRepliedMessageTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3replyingToTb4b4b4.Te6edf3lxmf_messageTff7b72?Tb4b4b4.Te6edf3hashTb4b4b4)Tff7b72?Tb4b4b4.Te6edf3contentTb4b4b4;
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3postTb4b4b4(Ta5d6ff`Ta5d6ff/api/v1/lxmf-messages/sendTa5d6ff`Tb4b4b4, Tb4b4b4{
Te6edf3delivery_methodTff7b72: Tff7b72thisTb4b4b4.Te6edf3newMessageDeliveryMethodTb4b4b4,
Te6edf3lxmf_messageTff7b72: Tb4b4b4{
Te6edf3destination_hashTff7b72: Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4.Te6edf3destination_hashTb4b4b4,
Te6edf3contentTff7b72: Tff7b72thisTb4b4b4.Te6edf3newMessageTextTb4b4b4,
Te6edf3reply_to_hashTff7b72: Tff7b72thisTb4b4b4.Te6edf3replyingToTff7b72?Tb4b4b4.Te6edf3lxmf_messageTff7b72?Tb4b4b4.Te6edf3hash Tff7b72|| Tff7b72nullTb4b4b4,
Te6edf3reply_quoted_contentTff7b72: Te6edf3repliedContent Tff7b72|| Tff7b72nullTb4b4b4,
Te6edf3fieldsTff7b72: Te6edf3firstFieldsTb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
T8b949e// add outbound message to ui
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3isLxmfMessageInUiTb4b4b4(Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hashTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3chatItemsTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4{
Te6edf3typeTff7b72: Ta5d6ff"lxmf_message"Tb4b4b4,
Te6edf3lxmf_messageTff7b72: Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3lxmf_messageTb4b4b4,
Te6edf3is_outboundTff7b72: Tff7b72trueTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e// send subsequent images as separate messages with image name as content
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3i Tff7b72= T79c0ff1Tb4b4b4; Te6edf3i Tff7b72< Te6edf3imagesTb4b4b4.Te6edf3lengthTb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3image Tff7b72= Te6edf3imagesTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3subsequentFields Tff7b72= Tb4b4b4{
Te6edf3imageTff7b72: Tb4b4b4{ Te6edf3image_typeTff7b72: Te6edf3imageTb4b4b4.Te6edf3image_typeTb4b4b4, Te6edf3image_bytesTff7b72: Te6edf3imageTb4b4b4.Te6edf3image_bytes Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3subResponse Tff7b72= Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3postTb4b4b4(Ta5d6ff`Ta5d6ff/api/v1/lxmf-messages/sendTa5d6ff`Tb4b4b4, Tb4b4b4{
Te6edf3delivery_methodTff7b72: Tff7b72thisTb4b4b4.Te6edf3newMessageDeliveryMethodTb4b4b4,
Te6edf3lxmf_messageTff7b72: Tb4b4b4{
Te6edf3destination_hashTff7b72: Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4.Te6edf3destination_hashTb4b4b4,
Te6edf3contentTff7b72: Te6edf3imageTb4b4b4.Te6edf3nameTb4b4b4,
Te6edf3fieldsTff7b72: Te6edf3subsequentFieldsTb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
T8b949e// add outbound message to ui
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3isLxmfMessageInUiTb4b4b4(Te6edf3subResponseTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hashTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3chatItemsTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4{
Te6edf3typeTff7b72: Ta5d6ff"lxmf_message"Tb4b4b4,
Te6edf3lxmf_messageTff7b72: Te6edf3subResponseTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3lxmf_messageTb4b4b4,
Te6edf3is_outboundTff7b72: Tff7b72trueTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3subErrorTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3errorTb4b4b4(Ta5d6ff`Ta5d6ffFailed to send image Tffd700${Te6edf3i Tff7b72+ T79c0ff1Tffd700}Ta5d6ff:Ta5d6ff`Tb4b4b4, Te6edf3subErrorTb4b4b4)Tb4b4b4;
T8b949e// we continue sending other images even if one fails
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
T8b949e// always scroll to bottom since we just sent a message
Tff7b72thisTb4b4b4.Te6edf3scrollMessagesToBottomTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// clear message inputs
Tff7b72thisTb4b4b4.Te6edf3newMessageText Tff7b72= Ta5d6ff""Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3saveDraftTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4.Te6edf3destination_hashTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3newMessageImages Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3newMessageImageUrls Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3newMessageAudio Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3newMessageTelemetry Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3newMessageFiles Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3clearFileInputTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3replyingTo Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
T8b949e// show error
Tff7b72const Te6edf3message Tff7b72= Te6edf3eTb4b4b4.Te6edf3responseTff7b72?Tb4b4b4.Te6edf3dataTff7b72?Tb4b4b4.Te6edf3message Tff7b72?? Ta5d6ff"failed to send message"Tb4b4b4;
Te6edf3DialogUtilsTb4b4b4.Te6edf3alertTb4b4b4(Te6edf3messageTb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72finally Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3isSendingMessage Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3cancelSendingMessageTb4b4b4(Te6edf3chatItemTb4b4b4) Tb4b4b4{
T8b949e// get lxmf message hash else do nothing
Tff7b72const Te6edf3lxmfMessageHash Tff7b72= Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hashTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3lxmfMessageHashTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72try Tb4b4b4{
T8b949e// cancel sending lxmf message
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3postTb4b4b4(Ta5d6ff`Ta5d6ff/api/v1/lxmf-messages/Tffd700${Te6edf3lxmfMessageHashTffd700}Ta5d6ff/cancelTa5d6ff`Tb4b4b4)Tb4b4b4;
T8b949e// get lxmf message from response
Tff7b72const Te6edf3lxmfMessage Tff7b72= Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3lxmf_messageTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3lxmfMessageTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// update lxmf message in ui
Tff7b72thisTb4b4b4.Te6edf3onLxmfMessageUpdatedTb4b4b4(Te6edf3lxmfMessageTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
T8b949e// show error
Tff7b72const Te6edf3message Tff7b72= Te6edf3eTb4b4b4.Te6edf3responseTff7b72?Tb4b4b4.Te6edf3dataTff7b72?Tb4b4b4.Te6edf3message Tff7b72?? Ta5d6ff"failed to cancel message"Tb4b4b4;
Te6edf3DialogUtilsTb4b4b4.Te6edf3alertTb4b4b4(Te6edf3messageTb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3retrySendingMessageTb4b4b4(Te6edf3chatItemTb4b4b4) Tb4b4b4{
T8b949e// force delete existing message
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3deleteChatItemTb4b4b4(Te6edf3chatItemTb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4;
Tff7b72try Tb4b4b4{
T8b949e// send message to reticulum
Tff7b72const Te6edf3replyQuoted Tff7b72=
Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTff7b72?Tb4b4b4.Te6edf3reply_quoted_content Tff7b72||
Tb4b4b4(Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3reply_to_hash Tff7b72&&
Tff7b72thisTb4b4b4.Te6edf3getRepliedMessageTb4b4b4(Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3reply_to_hashTb4b4b4)Tff7b72?Tb4b4b4.Te6edf3contentTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3postTb4b4b4(Ta5d6ff`Ta5d6ff/api/v1/lxmf-messages/sendTa5d6ff`Tb4b4b4, Tb4b4b4{
Te6edf3lxmf_messageTff7b72: Tb4b4b4{
Te6edf3destination_hashTff7b72: Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3destination_hashTb4b4b4,
Te6edf3contentTff7b72: Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3contentTb4b4b4,
Te6edf3reply_to_hashTff7b72: Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3reply_to_hash Tff7b72|| Tff7b72nullTb4b4b4,
Te6edf3reply_quoted_contentTff7b72: Te6edf3replyQuoted Tff7b72|| Tff7b72nullTb4b4b4,
Te6edf3fieldsTff7b72: Te6edf3chatItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3fieldsTb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
T8b949e// add outbound message to ui
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3isLxmfMessageInUiTb4b4b4(Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hashTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3chatItemsTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4{
Te6edf3typeTff7b72: Ta5d6ff"lxmf_message"Tb4b4b4,
Te6edf3lxmf_messageTff7b72: Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3lxmf_messageTb4b4b4,
Te6edf3is_outboundTff7b72: Tff7b72trueTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e// always scroll to bottom since we just sent a message
Tff7b72thisTb4b4b4.Te6edf3scrollMessagesToBottomTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
T8b949e// show error
Tff7b72const Te6edf3message Tff7b72= Te6edf3eTb4b4b4.Te6edf3responseTff7b72?Tb4b4b4.Te6edf3dataTff7b72?Tb4b4b4.Te6edf3message Tff7b72?? Ta5d6ff"failed to send message"Tb4b4b4;
Te6edf3DialogUtilsTb4b4b4.Te6edf3alertTb4b4b4(Te6edf3messageTb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3retryAllFailedOrCancelledMessagesTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3failedItems Tff7b72= Tff7b72thisTb4b4b4.Te6edf3selectedPeerChatItemsTb4b4b4.Te6edf3filterTb4b4b4(
Tb4b4b4(Te6edf3itemTb4b4b4) Tb4b4b4=> Te6edf3itemTb4b4b4.Te6edf3is_outbound Tff7b72&& Tb4b4b4[Ta5d6ff"failed"Tb4b4b4, Ta5d6ff"cancelled"Tb4b4b4]Tb4b4b4.Te6edf3includesTb4b4b4(Te6edf3itemTb4b4b4.Te6edf3lxmf_messageTff7b72?Tb4b4b4.Te6edf3stateTb4b4b4)
Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3failedItemsTb4b4b4.Te6edf3length Tff7b72=== T79c0ff0Tb4b4b4) Tff7b72returnTb4b4b4;
Tff7b72if Tb4b4b4(
Tff7b72!Tb4b4b4(Tff7b72await Te6edf3DialogUtilsTb4b4b4.Te6edf3confirmTb4b4b4(
Ta5d6ff`Ta5d6ffAre you sure you want to retry sending all Tffd700${Te6edf3failedItemsTb4b4b4.Te6edf3lengthTffd700}Ta5d6ff failed/cancelled messages?Ta5d6ff`
Tb4b4b4)Tb4b4b4)
Tb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3item Tff7b72of Te6edf3failedItemsTb4b4b4) Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3retrySendingMessageTb4b4b4(Te6edf3itemTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3shareLocationTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3toastKey Tff7b72= Ta5d6ff"location_share"Tb4b4b4;
Tff7b72try Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3configTff7b72?Tb4b4b4.Te6edf3location_source Tff7b72=== Ta5d6ff"manual"Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3lat Tff7b72= Tffa657parseFloatTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3configTb4b4b4.Te6edf3location_manual_latTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3lon Tff7b72= Tffa657parseFloatTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3configTb4b4b4.Te6edf3location_manual_lonTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3alt Tff7b72= Tffa657parseFloatTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3configTb4b4b4.Te6edf3location_manual_altTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tffa657isNaNTb4b4b4(Te6edf3latTb4b4b4) Tff7b72|| Tffa657isNaNTb4b4b4(Te6edf3lonTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3ToastUtilsTb4b4b4.Te6edf3errorTb4b4b4(Ta5d6ff"Invalid manual coordinates in settings"Tb4b4b4, T79c0ff5000Tb4b4b4, Te6edf3toastKeyTb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3newMessageTelemetry Tff7b72= Tb4b4b4{
Te6edf3latitudeTff7b72: Te6edf3latTb4b4b4,
Te6edf3longitudeTff7b72: Te6edf3lonTb4b4b4,
Te6edf3altitudeTff7b72: Tffa657isNaNTb4b4b4(Te6edf3altTb4b4b4) Tff7b72? T79c0ff0 Tff7b72: Te6edf3altTb4b4b4,
Te6edf3speedTff7b72: T79c0ff0Tb4b4b4,
Te6edf3bearingTff7b72: T79c0ff0Tb4b4b4,
Te6edf3accuracyTff7b72: T79c0ff0Tb4b4b4,
Te6edf3last_updateTff7b72: Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff1000Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3sendMessageTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3ToastUtilsTb4b4b4.Te6edf3successTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"messages.location_sent"Tb4b4b4)Tb4b4b4, T79c0ff3000Tb4b4b4, Te6edf3toastKeyTb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3navigatorTb4b4b4.Te6edf3geolocationTb4b4b4) Tb4b4b4{
Te6edf3DialogUtilsTb4b4b4.Te6edf3alertTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"map.geolocation_not_supported"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3ToastUtilsTb4b4b4.Te6edf3loadingTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"messages.fetching_location"Tb4b4b4)Tb4b4b4, T79c0ff0Tb4b4b4, Te6edf3toastKeyTb4b4b4)Tb4b4b4;
Te6edf3navigatorTb4b4b4.Te6edf3geolocationTb4b4b4.Te6edf3getCurrentPositionTb4b4b4(
Tb4b4b4(Te6edf3positionTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3newMessageTelemetry Tff7b72= Tb4b4b4{
Te6edf3latitudeTff7b72: Te6edf3positionTb4b4b4.Te6edf3coordsTb4b4b4.Te6edf3latitudeTb4b4b4,
Te6edf3longitudeTff7b72: Te6edf3positionTb4b4b4.Te6edf3coordsTb4b4b4.Te6edf3longitudeTb4b4b4,
Te6edf3altitudeTff7b72: Te6edf3positionTb4b4b4.Te6edf3coordsTb4b4b4.Te6edf3altitude Tff7b72|| T79c0ff0Tb4b4b4,
Te6edf3speedTff7b72: Tb4b4b4(Te6edf3positionTb4b4b4.Te6edf3coordsTb4b4b4.Te6edf3speed Tff7b72|| T79c0ff0Tb4b4b4) Tff7b72* T79c0ff3.6Tb4b4b4, T8b949e// m/s to km/h
Te6edf3bearingTff7b72: Te6edf3positionTb4b4b4.Te6edf3coordsTb4b4b4.Te6edf3heading Tff7b72|| T79c0ff0Tb4b4b4,
Te6edf3accuracyTff7b72: Te6edf3positionTb4b4b4.Te6edf3coordsTb4b4b4.Te6edf3accuracy Tff7b72|| T79c0ff0Tb4b4b4,
Te6edf3last_updateTff7b72: Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff1000Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3sendMessageTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3ToastUtilsTb4b4b4.Te6edf3successTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"messages.location_sent"Tb4b4b4)Tb4b4b4, T79c0ff3000Tb4b4b4, Te6edf3toastKeyTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tb4b4b4(Te6edf3errorTb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3ToastUtilsTb4b4b4.Te6edf3errorTb4b4b4(
Ta5d6ff`Ta5d6ffFailed to get location: Tffd700${Te6edf3errorTb4b4b4.Te6edf3messageTffd700}Ta5d6ff. Try setting location manually in Settings.Ta5d6ff`Tb4b4b4,
T79c0ff5000Tb4b4b4,
Te6edf3toastKey
Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3enableHighAccuracyTff7b72: Tff7b72trueTb4b4b4,
Te6edf3timeoutTff7b72: T79c0ff30000Tb4b4b4,
Te6edf3maximumAgeTff7b72: T79c0ff0Tb4b4b4,
Tb4b4b4}
Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
Te6edf3ToastUtilsTb4b4b4.Te6edf3errorTb4b4b4(Ta5d6ff`Ta5d6ffError: Tffd700${Te6edf3eTb4b4b4.Te6edf3messageTffd700}Ta5d6ff`Tb4b4b4, T79c0ff5000Tb4b4b4, Te6edf3toastKeyTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3requestLocationTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4) Tff7b72returnTb4b4b4;
T8b949e// Send a telemetry request command
Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3postTb4b4b4(Ta5d6ff`Ta5d6ff/api/v1/lxmf-messages/sendTa5d6ff`Tb4b4b4, Tb4b4b4{
Te6edf3lxmf_messageTff7b72: Tb4b4b4{
Te6edf3destination_hashTff7b72: Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4.Te6edf3destination_hashTb4b4b4,
Te6edf3contentTff7b72: Ta5d6ff""Tb4b4b4,
Te6edf3fieldsTff7b72: Tb4b4b4{
Te6edf3commandsTff7b72: Tb4b4b4[Tb4b4b4{ Ta5d6ff"0x01"Tff7b72: Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff1000Tb4b4b4) Tb4b4b4}Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3ToastUtilsTb4b4b4.Te6edf3successTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"messages.location_request_sent"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
Te6edf3ToastUtilsTb4b4b4.Te6edf3errorTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"messages.failed_send_location_request"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3viewLocationOnMapTb4b4b4(Te6edf3locationTb4b4b4) Tb4b4b4{
T8b949e// navigate to map and center on location
Tff7b72thisTb4b4b4.Te6edf3$routerTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4{
Te6edf3nameTff7b72: Ta5d6ff"map"Tb4b4b4,
Te6edf3queryTff7b72: Tb4b4b4{
Te6edf3latTff7b72: Te6edf3locationTb4b4b4.Te6edf3latitudeTb4b4b4,
Te6edf3lonTff7b72: Te6edf3locationTb4b4b4.Te6edf3longitudeTb4b4b4,
Te6edf3zoomTff7b72: T79c0ff15Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3isTelemetryOnlyTb4b4b4(Te6edf3msgTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3hasContent Tff7b72= Te6edf3msgTb4b4b4.Te6edf3content Tff7b72&& Te6edf3msgTb4b4b4.Te6edf3contentTb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4) Tff7b72!== Ta5d6ff""Tb4b4b4;
Tff7b72const Te6edf3hasAttachments Tff7b72= Te6edf3msgTb4b4b4.Te6edf3fieldsTff7b72?Tb4b4b4.Te6edf3image Tff7b72|| Te6edf3msgTb4b4b4.Te6edf3fieldsTff7b72?Tb4b4b4.Te6edf3audio Tff7b72|| Te6edf3msgTb4b4b4.Te6edf3fieldsTff7b72?Tb4b4b4.Te6edf3file_attachmentsTb4b4b4;
Tff7b72const Te6edf3hasTelemetry Tff7b72= Te6edf3msgTb4b4b4.Te6edf3fieldsTff7b72?Tb4b4b4.Te6edf3telemetry Tff7b72|| Te6edf3msgTb4b4b4.Te6edf3fieldsTff7b72?Tb4b4b4.Te6edf3telemetry_streamTb4b4b4;
Tff7b72const Te6edf3hasCommands Tff7b72= Te6edf3msgTb4b4b4.Te6edf3fieldsTff7b72?Tb4b4b4.Te6edf3commands Tff7b72&& Te6edf3msgTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3commandsTb4b4b4.Te6edf3someTb4b4b4(Tb4b4b4(Te6edf3cTb4b4b4) Tb4b4b4=> Te6edf3cTb4b4b4[Ta5d6ff"0x01"Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72!Te6edf3hasContent Tff7b72&& Tff7b72!Te6edf3hasAttachments Tff7b72&& Tb4b4b4(Te6edf3hasTelemetry Tff7b72|| Te6edf3hasCommandsTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3toggleTrackingTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4) Tff7b72returnTb4b4b4;
Tff7b72const Te6edf3hash Tff7b72= Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4.Te6edf3destination_hashTb4b4b4;
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3postTb4b4b4(Ta5d6ff`Ta5d6ff/api/v1/telemetry/tracking/Tffd700${Te6edf3hashTffd700}Ta5d6ff/toggleTa5d6ff`Tb4b4b4, Tb4b4b4{
Te6edf3is_trackingTff7b72: Tff7b72!Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4.Te6edf3is_trackingTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
T8b949e// Emit event to parent to update peer status
Tff7b72thisTb4b4b4.Te6edf3$emitTb4b4b4(Ta5d6ff"update-peer-tracking"Tb4b4b4, Tb4b4b4{
Te6edf3destination_hashTff7b72: Te6edf3hashTb4b4b4,
Te6edf3is_trackingTff7b72: Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3is_trackingTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3ToastUtilsTb4b4b4.Te6edf3successTb4b4b4(Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3is_tracking Tff7b72? Ta5d6ff"Live tracking enabled" Tff7b72: Ta5d6ff"Live tracking disabled"Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3errorTb4b4b4(Ta5d6ff"Failed to toggle tracking"Tb4b4b4, Te6edf3eTb4b4b4)Tb4b4b4;
Te6edf3ToastUtilsTb4b4b4.Te6edf3errorTb4b4b4(Ta5d6ff"Failed to update tracking status"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3formatTimeAgoTff7b72: Tff7b72function Tb4b4b4(Te6edf3datetimeStringTb4b4b4) Tb4b4b4{
T8b949e// Using this.now ensures the computed value updates when the timer ticks
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3now Tff7b72? Te6edf3UtilsTb4b4b4.Te6edf3formatTimeAgoTb4b4b4(Te6edf3datetimeStringTb4b4b4) Tff7b72: Te6edf3UtilsTb4b4b4.Te6edf3formatTimeAgoTb4b4b4(Te6edf3datetimeStringTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3formatDestinationHashTb4b4b4(Te6edf3hashTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3UtilsTb4b4b4.Te6edf3formatDestinationHashTb4b4b4(Te6edf3hashTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3copyHashTb4b4b4(Te6edf3hashTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72await Te6edf3navigatorTb4b4b4.Te6edf3clipboardTb4b4b4.Te6edf3writeTextTb4b4b4(Te6edf3hashTb4b4b4)Tb4b4b4;
Te6edf3ToastUtilsTb4b4b4.Te6edf3successTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"messages.hash_copied"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3errorTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
Te6edf3ToastUtilsTb4b4b4.Te6edf3errorTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"messages.failed_to_copy_hash"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3formatBytesTff7b72: Tff7b72function Tb4b4b4(Te6edf3bytesTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3UtilsTb4b4b4.Te6edf3formatBytesTb4b4b4(Te6edf3bytesTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3base64ByteLengthTb4b4b4(Te6edf3base64StringTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3base64StringTb4b4b4) Tb4b4b4{
Tff7b72return T79c0ff0Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3padding Tff7b72= Tb4b4b4(Te6edf3base64StringTb4b4b4.Te6edf3matchTb4b4b4(Ta5d6ff/=+$/Tb4b4b4) Tff7b72|| Tb4b4b4[Ta5d6ff""Tb4b4b4]Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4.Te6edf3lengthTb4b4b4;
Tff7b72return Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tb4b4b4(Te6edf3base64StringTb4b4b4.Te6edf3length Tff7b72* T79c0ff3Tb4b4b4) Tff7b72/ T79c0ff4Tb4b4b4) Tff7b72- Te6edf3paddingTb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3formatBase64BytesTb4b4b4(Te6edf3base64StringTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3formatBytesTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3base64ByteLengthTb4b4b4(Te6edf3base64StringTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3openConversationPopoutTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4) Tff7b72returnTb4b4b4;
Tff7b72const Te6edf3destinationHash Tff7b72= Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4.Te6edf3destination_hash Tff7b72|| Ta5d6ff""Tb4b4b4;
Tff7b72const Te6edf3encodedHash Tff7b72= Tffa657encodeURIComponentTb4b4b4(Te6edf3destinationHashTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3url Tff7b72= Ta5d6ff`Tffd700${Tffa657windowTb4b4b4.Te6edf3locationTb4b4b4.Te6edf3originTffd700}Tffd700${Tffa657windowTb4b4b4.Te6edf3locationTb4b4b4.Te6edf3pathnameTffd700}Ta5d6ff#/popout/messages/Tffd700${Te6edf3encodedHashTffd700}Ta5d6ff`Tb4b4b4;
Tffa657windowTb4b4b4.Te6edf3openTb4b4b4(Te6edf3urlTb4b4b4, Ta5d6ff"_blank"Tb4b4b4, Ta5d6ff"width=960,height=720,noopener"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3onStartCallTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3getTb4b4b4(Ta5d6ff`Ta5d6ff/api/v1/telephone/call/Tffd700${Tff7b72thisTb4b4b4.Te6edf3selectedPeerTb4b4b4.Te6edf3destination_hashTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3message Tff7b72= Te6edf3eTb4b4b4.Te6edf3responseTff7b72?Tb4b4b4.Te6edf3dataTff7b72?Tb4b4b4.Te6edf3message Tff7b72?? Ta5d6ff"Failed to start call"Tb4b4b4;
Te6edf3DialogUtilsTb4b4b4.Te6edf3alertTb4b4b4(Te6edf3messageTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3pasteFromClipboardTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Tff7b72await Te6edf3navigatorTb4b4b4.Te6edf3clipboardTb4b4b4.Te6edf3readTextTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3textTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3input Tff7b72= Tff7b72thisTb4b4b4.Te6edf3$refsTb4b4b4[Ta5d6ff"message-input"Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3start Tff7b72= Te6edf3inputTb4b4b4.Te6edf3selectionStartTb4b4b4;
Tff7b72const Te6edf3end Tff7b72= Te6edf3inputTb4b4b4.Te6edf3selectionEndTb4b4b4;
Tff7b72const Te6edf3currentText Tff7b72= Tff7b72thisTb4b4b4.Te6edf3newMessageText Tff7b72|| Ta5d6ff""Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3newMessageText Tff7b72= Te6edf3currentTextTb4b4b4.Te6edf3substringTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3startTb4b4b4) Tff7b72+ Te6edf3text Tff7b72+ Te6edf3currentTextTb4b4b4.Te6edf3substringTb4b4b4(Te6edf3endTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3$nextTickTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3inputTb4b4b4.Te6edf3focusTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3newCursorPos Tff7b72= Te6edf3start Tff7b72+ Te6edf3textTb4b4b4.Te6edf3lengthTb4b4b4;
Te6edf3inputTb4b4b4.Te6edf3setSelectionRangeTb4b4b4(Te6edf3newCursorPosTb4b4b4, Te6edf3newCursorPosTb4b4b4)Tb4b4b4;
T8b949e// adjust height
Te6edf3inputTb4b4b4.Te6edf3styleTb4b4b4.Te6edf3height Tff7b72= Ta5d6ff"auto"Tb4b4b4;
Te6edf3inputTb4b4b4.Te6edf3styleTb4b4b4.Te6edf3height Tff7b72= Tffa657MathTb4b4b4.Te6edf3minTb4b4b4(Te6edf3inputTb4b4b4.Te6edf3scrollHeightTb4b4b4, T79c0ff200Tb4b4b4) Tff7b72+ Ta5d6ff"px"Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3errTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3errorTb4b4b4(Ta5d6ff"Failed to read clipboard contents: "Tb4b4b4, Te6edf3errTb4b4b4)Tb4b4b4;
Te6edf3ToastUtilsTb4b4b4.Te6edf3errorTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"messages.failed_read_clipboard"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3onFileInputChangeTff7b72: Tff7b72function Tb4b4b4(Te6edf3eventTb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3file Tff7b72of Te6edf3eventTb4b4b4.Te6edf3targetTb4b4b4.Te6edf3filesTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3newMessageFilesTb4b4b4.Te6edf3pushTb4b4b4(Te6edf3fileTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3clearFileInputTff7b72: Tff7b72function Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3$refsTb4b4b4[Ta5d6ff"file-input"Tb4b4b4]Tb4b4b4.Te6edf3value Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3removeImageAttachmentTb4b4b4(Te6edf3indexTb4b4b4) Tb4b4b4{
T8b949e// ask user to confirm removing image attachment
Tff7b72if Tb4b4b4(Tff7b72!Tb4b4b4(Tff7b72await Te6edf3DialogUtilsTb4b4b4.Te6edf3confirmTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"messages.remove_image_confirm"Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// remove image
Tff7b72thisTb4b4b4.Te6edf3newMessageImagesTb4b4b4.Te6edf3spliceTb4b4b4(Te6edf3indexTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3newMessageImageUrlsTb4b4b4.Te6edf3spliceTb4b4b4(Te6edf3indexTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3onImageSelectedTff7b72: Tff7b72function Tb4b4b4(Te6edf3imageBlobTb4b4b4) Tb4b4b4{
T8b949e// update selected file
Tff7b72const Te6edf3index Tff7b72= Tff7b72thisTb4b4b4.Te6edf3newMessageImagesTb4b4b4.Te6edf3lengthTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3newMessageImagesTb4b4b4.Te6edf3pushTb4b4b4(Te6edf3imageBlobTb4b4b4)Tb4b4b4;
T8b949e// update image url when file is read
Tff7b72const Te6edf3fileReader Tff7b72= Tff7b72new Te6edf3FileReaderTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3fileReaderTb4b4b4.Te6edf3onload Tff7b72= Tb4b4b4(Te6edf3eventTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3newMessageImageUrlsTb4b4b4[Te6edf3indexTb4b4b4] Tff7b72= Te6edf3eventTb4b4b4.Te6edf3targetTb4b4b4.Te6edf3resultTb4b4b4;
Tb4b4b4}Tb4b4b4;
T8b949e// convert image to data url
Te6edf3fileReaderTb4b4b4.Te6edf3readAsDataURLTb4b4b4(Te6edf3imageBlobTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3startRecordingAudioAttachmentTb4b4b4(Te6edf3argsTb4b4b4) Tb4b4b4{
T8b949e// do nothing if already recording
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3isRecordingAudioAttachmentTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// ask user to confirm recording new audio attachment, if an existing audio attachment exists
Tff7b72if Tb4b4b4(
Tff7b72thisTb4b4b4.Te6edf3newMessageAudio Tff7b72&&
Tff7b72!Tb4b4b4(Tff7b72await Te6edf3DialogUtilsTb4b4b4.Te6edf3confirmTb4b4b4(
Ta5d6ff"An audio recording is already attached. A new recording will replace it. Do you want to continue?"
Tb4b4b4)Tb4b4b4)
Tb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// handle selected codec
Tff7b72switch Tb4b4b4(Te6edf3argsTb4b4b4.Te6edf3codecTb4b4b4) Tb4b4b4{
Tff7b72case Ta5d6ff"codec2"Tff7b72: Tb4b4b4{
T8b949e// start recording microphone
Tff7b72thisTb4b4b4.Te6edf3audioAttachmentMicrophoneRecorderCodec Tff7b72= Ta5d6ff"codec2"Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3audioAttachmentMicrophoneRecorder Tff7b72= Tff7b72new Te6edf3Codec2MicrophoneRecorderTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3audioAttachmentMicrophoneRecorderTb4b4b4.Te6edf3codec2Mode Tff7b72= Te6edf3argsTb4b4b4.Te6edf3modeTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3audioAttachmentRecordingStartedAt Tff7b72= Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3isRecordingAudioAttachment Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3audioAttachmentMicrophoneRecorderTb4b4b4.Te6edf3startTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// update recording time in ui every second
Tff7b72thisTb4b4b4.Te6edf3audioAttachmentRecordingDuration Tff7b72= Te6edf3UtilsTb4b4b4.Te6edf3formatMinutesSecondsTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3audioAttachmentRecordingTimer Tff7b72= Te6edf3setIntervalTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3recordingDurationMillis Tff7b72= Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4) Tff7b72- Tff7b72thisTb4b4b4.Te6edf3audioAttachmentRecordingStartedAtTb4b4b4;
Tff7b72const Te6edf3recordingDurationSeconds Tff7b72= Te6edf3recordingDurationMillis Tff7b72/ T79c0ff1000Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3audioAttachmentRecordingDuration Tff7b72= Te6edf3UtilsTb4b4b4.Te6edf3formatMinutesSecondsTb4b4b4(Te6edf3recordingDurationSecondsTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4, T79c0ff1000Tb4b4b4)Tb4b4b4;
T8b949e// alert if failed to start recording
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3isRecordingAudioAttachmentTb4b4b4) Tb4b4b4{
Te6edf3DialogUtilsTb4b4b4.Te6edf3alertTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"messages.failed_start_recording"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72case Ta5d6ff"opus"Tff7b72: Tb4b4b4{
T8b949e// start recording microphone
Tff7b72thisTb4b4b4.Te6edf3audioAttachmentMicrophoneRecorderCodec Tff7b72= Ta5d6ff"opus"Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3audioAttachmentMicrophoneRecorder Tff7b72= Tff7b72new Te6edf3MicrophoneRecorderTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3audioAttachmentRecordingStartedAt Tff7b72= Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3isRecordingAudioAttachment Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3audioAttachmentMicrophoneRecorderTb4b4b4.Te6edf3startTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// update recording time in ui every second
Tff7b72thisTb4b4b4.Te6edf3audioAttachmentRecordingDuration Tff7b72= Te6edf3UtilsTb4b4b4.Te6edf3formatMinutesSecondsTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3audioAttachmentRecordingTimer Tff7b72= Te6edf3setIntervalTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3recordingDurationMillis Tff7b72= Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4) Tff7b72- Tff7b72thisTb4b4b4.Te6edf3audioAttachmentRecordingStartedAtTb4b4b4;
Tff7b72const Te6edf3recordingDurationSeconds Tff7b72= Te6edf3recordingDurationMillis Tff7b72/ T79c0ff1000Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3audioAttachmentRecordingDuration Tff7b72= Te6edf3UtilsTb4b4b4.Te6edf3formatMinutesSecondsTb4b4b4(Te6edf3recordingDurationSecondsTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4, T79c0ff1000Tb4b4b4)Tb4b4b4;
T8b949e// alert if failed to start recording
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3isRecordingAudioAttachmentTb4b4b4) Tb4b4b4{
Te6edf3DialogUtilsTb4b4b4.Te6edf3alertTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"messages.failed_start_recording"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72defaultTff7b72: Tb4b4b4{
Te6edf3DialogUtilsTb4b4b4.Te6edf3alertTb4b4b4(Ta5d6ff`Ta5d6ffUnhandled microphone recorder codec: Tffd700${Te6edf3argsTb4b4b4.Te6edf3codecTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3stopRecordingAudioAttachmentTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// clear audio recording timer
Te6edf3clearIntervalTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3audioAttachmentRecordingTimerTb4b4b4)Tb4b4b4;
T8b949e// do nothing if not recording
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3isRecordingAudioAttachmentTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// stop recording microphone and get audio
Tff7b72thisTb4b4b4.Te6edf3isRecordingAudioAttachment Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72const Te6edf3audio Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3audioAttachmentMicrophoneRecorderTb4b4b4.Te6edf3stopTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// handle audio based on codec
Tff7b72switch Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3audioAttachmentMicrophoneRecorderCodecTb4b4b4) Tb4b4b4{
Tff7b72case Ta5d6ff"codec2"Tff7b72: Tb4b4b4{
T8b949e// do nothing if no audio was provided
Tff7b72if Tb4b4b4(Te6edf3audioTb4b4b4.Te6edf3length Tff7b72=== T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// decode codec2 audio back to wav so we can show a preview audio player before user sends it
Tff7b72const Te6edf3codec2Mode Tff7b72= Tff7b72thisTb4b4b4.Te6edf3audioAttachmentMicrophoneRecorderTb4b4b4.Te6edf3codec2ModeTb4b4b4;
Tff7b72const Te6edf3decoded Tff7b72= Tff7b72await Te6edf3Codec2LibTb4b4b4.Te6edf3runDecodeTb4b4b4(Te6edf3codec2ModeTb4b4b4, Tff7b72new Tffa657Uint8ArrayTb4b4b4(Te6edf3audioTb4b4b4)Tb4b4b4)Tb4b4b4;
T8b949e// convert decoded codec2 to wav audio and create a blob
Tff7b72const Te6edf3wavAudio Tff7b72= Tff7b72await Te6edf3Codec2LibTb4b4b4.Te6edf3rawToWavTb4b4b4(Te6edf3decodedTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3wavBlob Tff7b72= Tff7b72new Te6edf3BlobTb4b4b4(Tb4b4b4[Te6edf3wavAudioTb4b4b4]Tb4b4b4, Tb4b4b4{
Te6edf3typeTff7b72: Ta5d6ff"audio/wav"Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
T8b949e// determine audio mode
Tff7b72var Te6edf3audioMode Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72switch Tb4b4b4(Te6edf3codec2ModeTb4b4b4) Tb4b4b4{
Tff7b72case Ta5d6ff"1200"Tff7b72: Tb4b4b4{
Te6edf3audioMode Tff7b72= T79c0ff0x04Tb4b4b4; T8b949e// LXMF.AM_CODEC2_1200
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72case Ta5d6ff"3200"Tff7b72: Tb4b4b4{
Te6edf3audioMode Tff7b72= T79c0ff0x09Tb4b4b4; T8b949e// LXMF.AM_CODEC2_3200
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72defaultTff7b72: Tb4b4b4{
Te6edf3DialogUtilsTb4b4b4.Te6edf3alertTb4b4b4(Ta5d6ff`Ta5d6ffUnhandled microphone recorder codec2Mode: Tffd700${Te6edf3codec2ModeTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tb4b4b4}
T8b949e// update message audio attachment
Tff7b72thisTb4b4b4.Te6edf3newMessageAudio Tff7b72= Tb4b4b4{
Te6edf3audio_modeTff7b72: Te6edf3audioModeTb4b4b4,
Te6edf3audio_blobTff7b72: Tff7b72new Te6edf3BlobTb4b4b4(Tb4b4b4[Te6edf3audioTb4b4b4]Tb4b4b4)Tb4b4b4,
Te6edf3audio_preview_urlTff7b72: Te6edf3URLTb4b4b4.Te6edf3createObjectURLTb4b4b4(Te6edf3wavBlobTb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72case Ta5d6ff"opus"Tff7b72: Tb4b4b4{
T8b949e// do nothing if no audio was provided
Tff7b72if Tb4b4b4(Te6edf3audioTb4b4b4.Te6edf3size Tff7b72=== T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// update message audio attachment
Tff7b72thisTb4b4b4.Te6edf3newMessageAudio Tff7b72= Tb4b4b4{
Te6edf3audio_modeTff7b72: T79c0ff0x10Tb4b4b4, T8b949e// LXMF.AM_OPUS_OGG
Te6edf3audio_blobTff7b72: Te6edf3audioTb4b4b4, T8b949e// opus microphone recorder returns a blob
Te6edf3audio_preview_urlTff7b72: Te6edf3URLTb4b4b4.Te6edf3createObjectURLTb4b4b4(Te6edf3audioTb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3removeAudioAttachmentTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// ask user to confirm removing audio attachment
Tff7b72if Tb4b4b4(Tff7b72!Tb4b4b4(Tff7b72await Te6edf3DialogUtilsTb4b4b4.Te6edf3confirmTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"messages.remove_audio_confirm"Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// remove audio
Tff7b72thisTb4b4b4.Te6edf3newMessageAudio Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3removeFileAttachmentTff7b72: Tff7b72function Tb4b4b4(Te6edf3fileTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3newMessageFiles Tff7b72= Tff7b72thisTb4b4b4.Te6edf3newMessageFilesTb4b4b4.Te6edf3filterTb4b4b4(Tb4b4b4(Te6edf3newMessageFileTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72return Te6edf3newMessageFile Tff7b72!== Te6edf3fileTb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3addNewLineTff7b72: Tff7b72function Tb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// get cursor position for message input
Tff7b72const Te6edf3input Tff7b72= Tff7b72thisTb4b4b4.Te6edf3$refsTb4b4b4[Ta5d6ff"message-input"Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3cursorPosition Tff7b72= Te6edf3inputTb4b4b4.Te6edf3selectionStartTb4b4b4;
T8b949e// insert a newline character after the cursor position
Tff7b72const Te6edf3text Tff7b72= Tff7b72thisTb4b4b4.Te6edf3newMessageTextTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3newMessageText Tff7b72= Te6edf3textTb4b4b4.Te6edf3sliceTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3cursorPositionTb4b4b4) Tff7b72+ Ta5d6ff"\n" Tff7b72+ Te6edf3textTb4b4b4.Te6edf3sliceTb4b4b4(Te6edf3cursorPositionTb4b4b4)Tb4b4b4;
T8b949e// move cursor to the position after the added newline
Tff7b72const Te6edf3newCursorPosition Tff7b72= Te6edf3cursorPosition Tff7b72+ T79c0ff1Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3$nextTickTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3inputTb4b4b4.Te6edf3selectionStart Tff7b72= Te6edf3newCursorPositionTb4b4b4;
Te6edf3inputTb4b4b4.Te6edf3selectionEnd Tff7b72= Te6edf3newCursorPositionTb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3onEnterPressedTff7b72: Tff7b72function Tb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// add new line on mobile
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3isMobileTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3addNewLineTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// send message on desktop
Tff7b72thisTb4b4b4.Te6edf3sendMessageTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3onShiftEnterPressedTff7b72: Tff7b72function Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3addNewLineTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3addFilesToMessageTff7b72: Tff7b72function Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3$refsTb4b4b4[Ta5d6ff"file-input"Tb4b4b4]Tb4b4b4.Te6edf3clickTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3findConversationTff7b72: Tff7b72function Tb4b4b4(Te6edf3destinationHashTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3conversationsTb4b4b4.Te6edf3findTb4b4b4(Tb4b4b4(Te6edf3conversationTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72return Te6edf3conversationTb4b4b4.Te6edf3destination_hash Tff7b72=== Te6edf3destinationHashTb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3markConversationAsReadTb4b4b4(Te6edf3conversationTb4b4b4) Tb4b4b4{
T8b949e// manually mark conversation read in memory to avoid delay updating ui
Te6edf3conversationTb4b4b4.Te6edf3is_unread Tff7b72= Tff7b72falseTb4b4b4;
T8b949e// mark conversation as read on server
Tff7b72try Tb4b4b4{
Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3getTb4b4b4(Ta5d6ff`Ta5d6ff/api/v1/lxmf/conversations/Tffd700${Te6edf3conversationTb4b4b4.Te6edf3destination_hashTffd700}Ta5d6ff/mark-as-readTa5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
T8b949e// do nothing if failed to mark as read
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e// reload conversations
Tff7b72thisTb4b4b4.Te6edf3$emitTb4b4b4(Ta5d6ff"reload-conversations"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3toggleSentMessageInfoTff7b72: Tff7b72function Tb4b4b4(Te6edf3messageHashTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3expandedMessageInfo Tff7b72=== Te6edf3messageHashTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3expandedMessageInfo Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3expandedMessageInfo Tff7b72= Te6edf3messageHashTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3toggleReceivedMessageInfoTff7b72: Tff7b72function Tb4b4b4(Te6edf3messageHashTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3expandedMessageInfo Tff7b72=== Te6edf3messageHashTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3expandedMessageInfo Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3expandedMessageInfo Tff7b72= Te6edf3messageHashTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3getMessageInfoLinesTff7b72: Tff7b72function Tb4b4b4(Te6edf3lxmfMessageTb4b4b4, Te6edf3isOutboundTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3lines Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3isOutboundTb4b4b4) Tb4b4b4{
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff`Ta5d6ffCreated: Tffd700${Te6edf3UtilsTb4b4b4.Te6edf3convertUnixMillisToLocalDateTimeStringTb4b4b4(Te6edf3lxmfMessageTb4b4b4.Te6edf3timestamp Tff7b72* T79c0ff1000Tb4b4b4)Tffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff`Ta5d6ffSent: Tffd700${Te6edf3UtilsTb4b4b4.Te6edf3convertUnixMillisToLocalDateTimeStringTb4b4b4(Te6edf3lxmfMessageTb4b4b4.Te6edf3timestamp Tff7b72* T79c0ff1000Tb4b4b4)Tffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff`Ta5d6ffReceived: Tffd700${Te6edf3UtilsTb4b4b4.Te6edf3convertDateTimeToLocalDateTimeStringTb4b4b4(Tff7b72new Tffa657DateTb4b4b4(Te6edf3lxmfMessageTb4b4b4.Te6edf3created_atTb4b4b4)Tb4b4b4)Tffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff`Ta5d6ffMethod: Tffd700${Te6edf3lxmfMessageTb4b4b4.Te6edf3method Tff7b72?? Ta5d6ff"unknown"Tffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3lxmfMessageTb4b4b4.Te6edf3fieldsTff7b72?Tb4b4b4.Te6edf3audioTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3audioSize Tff7b72=
Te6edf3lxmfMessageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3audioTb4b4b4.Te6edf3audio_size Tff7b72??
Tb4b4b4(Te6edf3lxmfMessageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3audioTb4b4b4.Te6edf3audio_bytes Tff7b72? Te6edf3atobTb4b4b4(Te6edf3lxmfMessageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3audioTb4b4b4.Te6edf3audio_bytesTb4b4b4)Tb4b4b4.Te6edf3length Tff7b72: T79c0ff0Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3audioSize Tff7b72> T79c0ff0Tb4b4b4) Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff`Ta5d6ffAudio Attachment: Tffd700${Tff7b72thisTb4b4b4.Te6edf3formatBytesTb4b4b4(Te6edf3audioSizeTb4b4b4)Tffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3lxmfMessageTb4b4b4.Te6edf3fieldsTff7b72?Tb4b4b4.Te6edf3imageTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3imageSize Tff7b72=
Te6edf3lxmfMessageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3imageTb4b4b4.Te6edf3image_size Tff7b72??
Tb4b4b4(Te6edf3lxmfMessageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3imageTb4b4b4.Te6edf3image_bytes Tff7b72? Te6edf3atobTb4b4b4(Te6edf3lxmfMessageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3imageTb4b4b4.Te6edf3image_bytesTb4b4b4)Tb4b4b4.Te6edf3length Tff7b72: T79c0ff0Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3imageSize Tff7b72> T79c0ff0Tb4b4b4) Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff`Ta5d6ffImage Attachment: Tffd700${Tff7b72thisTb4b4b4.Te6edf3formatBytesTb4b4b4(Te6edf3imageSizeTb4b4b4)Tffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3lxmfMessageTb4b4b4.Te6edf3fieldsTff7b72?Tb4b4b4.Te6edf3file_attachmentsTb4b4b4) Tb4b4b4{
Tff7b72let Te6edf3filesLength Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72const Te6edf3fileAttachments Tff7b72= Te6edf3lxmfMessageTb4b4b4.Te6edf3fieldsTb4b4b4.Te6edf3file_attachmentsTb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3fileAttachment Tff7b72of Te6edf3fileAttachmentsTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3fileBytesLength Tff7b72=
Te6edf3fileAttachmentTb4b4b4.Te6edf3file_size Tff7b72??
Tb4b4b4(Te6edf3fileAttachmentTb4b4b4.Te6edf3file_bytes Tff7b72? Te6edf3atobTb4b4b4(Te6edf3fileAttachmentTb4b4b4.Te6edf3file_bytesTb4b4b4)Tb4b4b4.Te6edf3length Tff7b72: T79c0ff0Tb4b4b4)Tb4b4b4;
Te6edf3filesLength Tff7b72+= Te6edf3fileBytesLengthTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3filesLength Tff7b72> T79c0ff0Tb4b4b4) Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff`Ta5d6ffFile Attachments: Tffd700${Tff7b72thisTb4b4b4.Te6edf3formatBytesTb4b4b4(Te6edf3filesLengthTb4b4b4)Tffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3isOutboundTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3lxmfMessageTb4b4b4.Te6edf3quality Tff7b72!= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff`Ta5d6ffSignal Quality: Tffd700${Te6edf3lxmfMessageTb4b4b4.Te6edf3qualityTffd700}Ta5d6ff%Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3lxmfMessageTb4b4b4.Te6edf3rssi Tff7b72!= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff`Ta5d6ffRSSI: Tffd700${Te6edf3lxmfMessageTb4b4b4.Te6edf3rssiTffd700}Ta5d6ffdBmTa5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3lxmfMessageTb4b4b4.Te6edf3snr Tff7b72!= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff`Ta5d6ffSNR: Tffd700${Te6edf3lxmfMessageTb4b4b4.Te6edf3snrTffd700}Ta5d6ffdBTa5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3linesTb4b4b4;
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4<Tb4b4b4/Tff7b72scriptTb4b4b4>
Tb4b4b4<Tff7b72style Te6edf3scopedTb4b4b4>
Tb4b4b4.T56d364attachment-card Tb4b4b4{
@apply relative flex gap-3 border border-gray-200 Te6edf3darkTb4b4b4:Tff7b72borderTff7b72-Te6edf3zinc-800 Te6edf3rounded-2xl Te6edf3p-3 Te6edf3shadow-smTb4b4b4;
Tff7b72background-colorTb4b4b4: Tff7b72whiteTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364dark Tb4b4b4.T56d364attachment-card Tb4b4b4{
Tff7b72background-colorTb4b4b4: Tffa657rgbTb4b4b4(T79c0ff24 T79c0ff24 T79c0ff27Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364attachment-card__preview Tb4b4b4{
@apply w-24 h-24 overflow-hidden rounded-xl bg-gray-100 Te6edf3darkTb4b4b4:Te6edf3bg-zinc-800 Tff7b72cursorTff7b72-Tff7b72pointerTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364attachment-card__body Tb4b4b4{
@apply flex-1Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364attachment-card__title Tb4b4b4{
@apply text-sm font-semibold text-gray-800 Te6edf3darkTb4b4b4:Tff7b72textTff7b72-Tff7b72grayT79c0ff-100Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364attachment-card__meta Tb4b4b4{
@apply text-xs text-gray-500 Te6edf3darkTb4b4b4:Tff7b72textTff7b72-Tff7b72grayT79c0ff-400Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364attachment-card__remove Tb4b4b4{
@apply absolute top-2 right-2 inline-flex items-center justify-center w-6 h-6 rounded-full bg-gray-200 Te6edf3darkTb4b4b4:Te6edf3bg-zinc-800 Tff7b72textTff7b72-Tff7b72grayT79c0ff-600 Te6edf3darkTff7b72:Tff7b72textTff7b72-Tff7b72grayT79c0ff-200 Te6edf3hoverTff7b72:Te6edf3bg-red-100 Te6edf3hoverTff7b72:Tff7b72textTff7b72-Tff7b72redT79c0ff-600 Te6edf3darkTff7b72:Te6edf3hoverTff7b72:Te6edf3bg-red-900Tff7b72/T79c0ff40Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364attachment-chip Tb4b4b4{
@apply flex items-center justify-between gap-2 border border-gray-200 Te6edf3darkTb4b4b4:Tff7b72borderTff7b72-Te6edf3zinc-800 Te6edf3rounded-full Te6edf3px-3 Te6edf3py-1 Tff7b72textTff7b72-Te6edf3xs Te6edf3shadow-smTb4b4b4;
Tff7b72background-colorTb4b4b4: Tff7b72whiteTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364dark Tb4b4b4.T56d364attachment-chip Tb4b4b4{
Tff7b72background-colorTb4b4b4: Tffa657rgbTb4b4b4(T79c0ff24 T79c0ff24 T79c0ff27Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364attachment-chip__remove Tb4b4b4{
@apply inline-flex items-center justify-center text-gray-500 Te6edf3darkTb4b4b4:Tff7b72textTff7b72-Tff7b72grayT79c0ff-300 Te6edf3hoverTff7b72:Tff7b72textTff7b72-Tff7b72redT79c0ff-500Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364attachment-action-button Tb4b4b4{
@apply inline-flex items-center gap-1 rounded-full border border-gray-200 px-3 py-1.5 text-xs font-bold text-gray-700 bg-white shadow-sm transition-all !importantTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364attachment-action-buttonTb4b4b4:Tf0883ehover Tb4b4b4{
@apply bg-gray-50 text-gray-900 border-blue-400 !importantTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364dark Tb4b4b4.T56d364attachment-action-button Tb4b4b4{
@apply border-zinc-700 text-zinc-100 bg-zinc-900 !importantTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364dark Tb4b4b4.T56d364attachment-action-buttonTb4b4b4:Tf0883ehover Tb4b4b4{
@apply bg-zinc-800 text-white border-blue-500 !importantTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364audio-controls-light Tb4b4b4{
Tff7b72filterTb4b4b4: Tffa657invertTb4b4b4(T79c0ff1Tb4b4b4) Tffa657hue-rotateTb4b4b4(T79c0ff180Tffa657degTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364dark Tb4b4b4.T56d364audio-controls-light Tb4b4b4{
Tff7b72filterTb4b4b4: Tff7b72noneTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364audio-controls-dark Tb4b4b4{
Tff7b72filterTb4b4b4: Tff7b72noneTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364dark Tb4b4b4.T56d364audio-controls-dark Tb4b4b4{
Tff7b72filterTb4b4b4: Tffa657invertTb4b4b4(T79c0ff1Tb4b4b4) Tffa657hue-rotateTb4b4b4(T79c0ff180Tffa657degTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-content Tb4b4b4:Tf0883edeepTff7b72(Tff7b72pTff7b72) Tb4b4b4{
Tff7b72marginTb4b4b4: T79c0ff0.5Tffa657rem T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-content Tb4b4b4:Tf0883edeepTff7b72(Tff7b72strongTff7b72) Tb4b4b4{
Tff7b72font-weightTb4b4b4: T79c0ff700Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-content Tb4b4b4:Tf0883edeepTff7b72(Tff7b72emTff7b72) Tb4b4b4{
Tff7b72font-styleTb4b4b4: Tff7b72italicTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-content Tb4b4b4:Tf0883edeepTff7b72(Tff7b72preTff7b72) Tb4b4b4{
Tff7b72marginTb4b4b4: T79c0ff0.75Tffa657rem T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-content Tb4b4b4:Tf0883edeepTff7b72(Tff7b72codeTff7b72) Tb4b4b4{
Tff7b72font-familyTb4b4b4: Te6edf3ui-monospaceTb4b4b4, Te6edf3SFMono-RegularTb4b4b4, Te6edf3MenloTb4b4b4, Te6edf3MonacoTb4b4b4, Te6edf3ConsolasTb4b4b4, Ta5d6ff"Liberation Mono"Tb4b4b4, Ta5d6ff"Courier New"Tb4b4b4, Tff7b72monospaceTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-content Tb4b4b4:Tf0883edeepTff7b72(Tff7b72h1Tff7b72)Tff7b72,
Tb4b4b4.T56d364markdown-content Tb4b4b4:Tf0883edeepTff7b72(Tff7b72h2Tff7b72)Tff7b72,
Tb4b4b4.T56d364markdown-content Tb4b4b4:Tf0883edeepTff7b72(Tff7b72h3Tff7b72) Tb4b4b4{
Tff7b72line-heightTb4b4b4: T79c0ff1.2Tb4b4b4;
Tb4b4b4}
Tb4b4b4<Tb4b4b4/Tff7b72styleTb4b4b4>
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────